Snažím se přesunout posledních 8 souborů z Documents
adresář do jiného adresáře, ale nechci je přesouvat po jednom do tohoto konkrétního adresáře. Je možné je přesunout náhradou za tail
příkaz, ale pro adresáře místo souborů? Chci říct, že bych to chtěl udělat s něčím jako tail -8 ./Documents | mv ./Anotherdirectory
nebo s mv tail -8 ./Documents ./Anotherdirectory
.
Ve skutečnosti hledám chytrý způsob, jak bych mohl přesunout posledních 8 souborů (jak je uvedeno v ls
) rychle (bez vypisování jednotlivých jmen) do jiného adresáře. Nějaké návrhy?
Přijatá odpověď:
Můžete použít for
, který prochází soubory uspořádaným způsobem a umožňuje nám vyhnout se analýze výstupu find
nebo ls
, abyste se vyhnuli problémům s mezerami a jinými speciálními znaky v názvech souborů. Mnohokrát děkuji @muru za zlepšení 🙂
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
Nejprve to vyzkoušejte pomocí echo
a poté odeberte echo
skutečně přesunout soubory.
Jako skript:
#!/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
znovu odstraňte echo
po testování přesunout soubory do skutečného stavu
Vysvětlení
i=0
říct shellu, aby začal iterovat na 0j=$(stat ~/Documents/* --printf "%in" | wc -l )
toto je nastavení proměnnéj
na celé číslo rovné celkovému počtu souborů v adresáři. Díky Sergově odpovědi na mou vlastní otázku, jak spolehlivě počítat soubory bez ohledu na to, jaké znaky obsahují jejich názvydo if (( (j - ++i) < 8 ))
pro každou iteraci cyklu otestujte, zda je výsledekj
mínus počet spuštění smyčky je menší než 8 a pokud ano, pakmv -v -- "$k" ~/AnotherDirectory
přesuňte soubor do nového adresáře