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éjna 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ýsledekjmínus počet spuštění smyčky je menší než 8 a pokud ano, pakmv -v -- "$k" ~/AnotherDirectorypřesuňte soubor do nového adresáře