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=0
dicendo alla shell di iniziare l'iterazione a 0j=$(stat ~/Documents/* --printf "%in" | wc -l )
questo sta impostando la variabilej
a 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 dij
meno il numero di volte in cui il ciclo è stato eseguito è inferiore a 8 e se lo è alloramv -v -- "$k" ~/AnotherDirectory
sposta il file nella nuova directory