Spostare un gruppo di file, chiedendo conferma all'utente per ogni file


9

Sistema: Ubuntu MATE 18.04.

Ho una raccolta di file (in più directory in una struttura di directory) e voglio spostarne molti in un'altra directory. Posso dire quali file voglio spostare con i loro nomi (sono titoli di ricette), ma non c'è altro modo per distinguere tra i file che voglio spostare e quelli che non voglio spostare; Devo prendere una decisione per ogni file esaminando il nome da solo.

Quindi, sto eseguendo un comando una volta per ogni file che voglio spostare, come

mv Snacks/OkaraCrackers NeedsTesting/
mv Snacks/SunflowerBrittle NeedsTesting/
mv Treats/ChocolateChilliFudge NeedsTesting/
mv Treats/PecanBlondies NeedsTesting/

Anche con il completamento delle tabulazioni, questo è troppo difficile da scrivere. Quello che voglio davvero fare è qualcosa di simile

shopt -s globstar
mv --prompt-me-for-every-file ** NeedsTesting/

Quindi posso semplicemente premere yo nper ciascun file.

Come posso spostare un gruppo di file e ricevere conferma per ogni file?

Risposte:


6

Modo 1: nel browser dei file grafici, usando una vista ad albero

Presumo che il tuo vero obiettivo sia quello di fare una scelta per ogni file e, non parlando rigorosamente, di essere richiesto . Tuttavia, se si preferisce ricevere una richiesta su ciascun file in un terminale, vedere il modo 2 di seguito.

La maggior parte dei browser di file grafici supporta una visualizzazione ad albero in cui è possibile visualizzare contemporaneamente più livelli di una gerarchia di directory. È possibile copiare o spostare i file da questa vista, individualmente o selezionandoli e quindi operando sull'intera selezione. Funziona anche con file di più cartelle.

In alcuni browser di file, è necessario accedere al menu Preferenze per abilitare la visualizzazione ad albero. In Caja, il browser dei file MATE, è sempre abilitato nella visualizzazione elenco. Fai clic su Visualizza → Elenco (o premi Ctrl+ 2) per passare alla visualizzazione elenco. Ogni directory ha un piccolo triangolo rivolto a destra alla sua sinistra, a indicare che può essere espansa. Per espandere una cartella, fai clic su quel triangolo o premi il tasto (freccia destra) quando la cartella è selezionata. In questo esempio, li ho selezionati tutti uno per uno e li sto trascinando tutti in una volta la loro destinazione:

più file selezionati in una struttura ad albero nel browser dei file Caja, trascinati in un'altra cartella ma non ancora spostati

Supponendo che l'origine e la destinazione siano sulla stessa unità, trascinando le mosse per impostazione predefinita. Se invece volessi copiare, tieni premuto il Ctrltasto.

la situazione dopo il completamento del trascinamento, in cui i file selezionati sono ora tutti insieme nella cartella di destinazione anziché nelle posizioni separate originali

In teoria, è facile correggere gli errori quando si utilizza questo metodo, poiché la maggior parte dei browser di file (incluso Caja) supporta Ctrl+ Zper annullare le azioni recenti, incluse le azioni batch. Tuttavia, ho avuto fortuna mista con quello. A volte i file tornano nella cartella sbagliata.

La buona notizia è che sembra che tu stia lavorando principalmente con documenti di testo, che tendono ad essere piccoli, quindi puoi fare un backup extra con tarprima senza molta seccatura. Suggerisco di farlo indipendentemente dal metodo utilizzato.

Modo 2 : il findcomando con l' -okazione

È uso comune findtrovare file e passare i loro percorsi a un comando esterno arbitrario con le azioni -exece -execdir. Ma findha anche -oke -okdirquel prompt prima di ogni volta che eseguono un comando. Se vuoi davvero essere richiesto in un terminale su ogni file, penso che questa sia la strada da percorrere.

Al termine per produrre gli stessi effetti mostrati sopra, è simile al seguente:

ek@Gnar:~$ find Texts -xtype f -ok mv -t 'Glorious Destination Folder' {} \;
< mv ... Texts/Robert Frost/New Hampshire.pdf > ? y
< mv ... Texts/Robert Frost/In The Clearing.pdf > ? n
< mv ... Texts/Helen Keller/The Story of My Life.pdf > ? y
< mv ... Texts/Saki/The Short Stories of Saki.pdf > ? y
< mv ... Texts/Jane Austen/Sense and Sensibility.pdf > ? n
< mv ... Texts/Jane Austen/Pride and Prejudice.pdf > ? y
< mv ... Texts/Richard Connell/The Stolen Crime.pdf > ? n
< mv ... Texts/Richard Connell/The Most Dangerous Game.txt > ? y
< mv ... Texts/Mary Wollstonecraft Shelley/Mathilda.epub > ? n
< mv ... Texts/Mary Wollstonecraft Shelley/Frankenstein: Or, The Modern Prometheus.pdf > ? y
< mv ... Texts/W. E. B. Du Bois/The Souls of Black Folk.pdf > ? n
< mv ... Texts/W. E. B. Du Bois/Darkwater: Voices from within the Veil.htm > ? y

Sostituisci Textscon la directory di origine (che potrebbe essere solo .se ci sei cd) e Glorious Destination Foldercon la directory di destinazione effettiva.

Questo esegue un comando per file; diversamente da -exece -execdir, -oke -okdirnon supporta +al posto di \;passare più percorsi trovati nella stessa invocazione di un comando. Di conseguenza, non è necessario utilizzare il -t destmodulo di mv. Suggerisco di farlo in ogni caso, però, sia , in generale, con finde in particolare in questa situazione così le indicazioni sembrano più i comandi che stanno spingendo circa.

Mentre viene scritto quel comando, se findincontra un collegamento simbolico che alla fine punta a un file normale, esso (il collegamento, non la destinazione) viene spostato anziché ignorato. Se vuoi davvero far funzionare solo un file normale, usa -type finvece di -xtype f.

Potresti voler fare questo in una scriptsessione in modo da poter capire cosa è successo se commetti un errore. Ma ancora una volta, nessun motivo per non avere un backup.

Modo 3: generare un manifest e modificarlo

Almeno fino a quando i file non hanno finduna nuova riga nei loro nomi, puoi iniziare usando un semplice comando per generare un manifest - un file che elenca i nomi dei file a cui (in questo caso potenzialmente) sei interessato) :

find Texts -xtype f >manifest

Sostituisci manifestcon il nome che preferisci per il file che elenca i file in esame (e regola le direzioni rimanenti di conseguenza).

Come sopra, sostituiscilo Textscon la tua vera directory di origine, che potrebbe essere .se ci sei riuscito cd. Tuttavia, se Textsè un percorso relativo (incluso se è .), è necessario assicurarsi di trovarsi nella stessa posizione in un secondo momento quando si eseguono effettivamente le mosse.

Dopo aver eseguito quel findcomando, apri manifestin un editor di testo. Questo potrebbe essere nano, vim, emacs, gedit, pluma, ecc l'editor, commento fuori le righe che i file nome che non si desidera spostare ponendo #un'all'inizio del loro. Alcuni editor metteranno in evidenza queste righe in modo diverso anche quando non riconoscono che il tuo file sia del formato che sa avere commenti. La maggior parte non lo farà, tuttavia, e il vero motivo per cui suggerisco di farlo in questo modo è che tu, come essere umano, è probabile che tu abbia esperienza di commentare le righe nei file di configurazione (e forse nel codice sorgente). Penso che questo sia più intuitivo, e meno soggetto a errori, rispetto a quello che sarebbe segnare le linee che si desidera spostare.

Ovviamente, potresti invece semplicemente eliminare le righe per i file che non vuoi spostare. Il vantaggio di commentarli è che sarà chiaro in seguito cosa hai fatto.

Nel mio esempio, ecco come apparivano i contenuti del file dopo averlo modificato:

Texts/Robert Frost/New Hampshire.pdf
# Texts/Robert Frost/In The Clearing.pdf
Texts/Helen Keller/The Story of My Life.pdf
Texts/Saki/The Short Stories of Saki.pdf
# Texts/Jane Austen/Sense and Sensibility.pdf
Texts/Jane Austen/Pride and Prejudice.pdf
# Texts/Richard Connell/The Stolen Crime.pdf
Texts/Richard Connell/The Most Dangerous Game.txt
# Texts/Mary Wollstonecraft Shelley/Mathilda.epub
Texts/Mary Wollstonecraft Shelley/Frankenstein: Or, The Modern Prometheus.pdf
# Texts/W. E. B. Du Bois/The Souls of Black Folk.pdf
Texts/W. E. B. Du Bois/Darkwater: Voices from within the Veil.htm

Quindi puoi filtrare le righe commentate con grepe convogliare il risultato xargsper passarle a mv:

grep -Pv '^\s*#' manifest | xargs -d '\n' mv -t 'Glorious Destination Folder'

Come sopra, sostituire Glorious Destination Foldercon il nome della destinazione effettiva. Questo è tutto; i tuoi file vengono spostati. Puoi ovviamente scrivere echoprima mvdi vedere i comandi che verranno eseguiti per primi, se lo desideri.

Il modo in cui funziona il comando è:

  1. Il grepcomando genera righe da manifestthat don't ( -v) start ( ^) con optional ( *) whitespace ( \s) seguito da un #carattere letterale . La -Pbandiera seleziona PCRE come dialetto delle espressioni regolari (che abilita \sciò che considero più leggibile rispetto al tradizionale [[:space:]]).
  2. Il xargscomando divide il suo input (che è l'output di grep) in campi con fine riga ( -d '\n'), quindi incolla ogni campo (senza la riga di fine nuova) come argomento separato alla fine del comando mv -t 'Glorious Destination Folder', che viene eseguito.

1
-okIMHO la migliore risposta
pim

7

Ecco un piccolo script ( mv-confirm.sh):

#!/bin/bash

# Just make sure there are at least one source and one destination
if [ "$#" -lt 2 ]; then
    echo "Illegal number of parameters"
fi

DESTINATION=${*:$#}             # last argument
SOURCES=( ${@:1:$#-1} )         # all but last arguments

for i in "${SOURCES[@]}"
do
    read -p "move '$i' to '$DESTINATION' ? [y/n] " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]
    then
        echo mv "$i" "$DESTINATION"
    fi
done

Esempio di utilizzo:

./mv-confirm.sh ** somewhere
move 'a' to 'somewhere' ? [y/n] n
move 'b' to 'somewhere' ? [y/n] y
mv b d
...

non dimenticare di rendere eseguibile lo script ( chmod +x mv-confirm.sh).

NB

Dal momento che non voglio fare confusione con i tuoi file, ho aggiunto echoprima del mv comando effettivo . Sentiti libero di rimuoverlo per spostare effettivamente i file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.