Sto cercando di spostare gli ultimi 8 file da Documents directory in un'altra directory, ma non voglio spostarli uno per uno in quella directory specifica. E' possibile spostarli sostituendo la tail comando, ma per le directory invece dei file? Voglio dire, mi piacerebbe farlo con qualcosa come tail -8 ./Documents | mv ./Anotherdirectory o con mv tail -8 ./Documents ./Anotherdirectory .
In effetti, sto cercando un modo intelligente per spostare gli ultimi 8 file (come elencato in ls ) rapidamente (senza digitare ogni nome) nell'altra directory. Qualche suggerimento?
Risposta accettata:
Puoi usare for , che scorre i file in modo ordinato e ci consente di evitare di analizzare l'output di find o ls , per evitare problemi con spazi e altri caratteri speciali nei nomi dei file. Mille grazie a @muru per aver migliorato questo 🙂
i=0; j=$(stat ~/Documents/* --printf "%in" | wc -l); for k in ~/Documents/*; do if (( (j - ++i) < 8 )); then echo mv -v "$k" ~/AnotherDirectory; fi; done
Provalo prima con echo , quindi rimuovi echo per spostare effettivamente i file.
Come copione:
#!/bin/bash
i=0
j=$(stat ~/Documents/* --printf "%in" | wc -l )
for k in ~/Documents/*; do
if (( (j - ++i) < 8 )); then
echo mv -v -- "$k" ~/AnotherDirectory
fi
done
di nuovo, rimuovi echo dopo aver provato a spostare i file sul serio
Spiegazione
i=0dicendo alla shell di iniziare l'iterazione a 0j=$(stat ~/Documents/* --printf "%in" | wc -l )questo sta impostando la variabileja un numero intero uguale al numero totale di file nella directory. Grazie alla risposta di Serg alla mia domanda su come contare i file in modo affidabile, indipendentemente dai caratteri che contengono i loro nomido if (( (j - ++i) < 8 ))per ogni iterazione del ciclo, verifica se il risultato dijmeno il numero di volte in cui il ciclo è stato eseguito è inferiore a 8 e se lo è alloramv -v -- "$k" ~/AnotherDirectorysposta il file nella nuova directory