Následující by mělo fungovat na absolutně všech cestách.
Deklarujte funkci, aby mohla používat head a tail na výstupu odděleném NUL:
nul_terminated() {
tr '\0\n' '\n\0' | "example@unixlinux.online" | tr '\0\n' '\n\0'
}
Poté jej můžete použít k získání seznamu cest oddělených NUL z vašeho vyhledávání po průchodu tail :
find . -exec printf '%s\0' {} \; | nul_terminated tail -n 2
Poté to můžete pomocí kanálu xargs a přidejte své možnosti:
find . -iname "*FooBar*" -exec printf '%s\0' {} \; | nul_terminated tail -n 2 | xargs -I "{}" -0 cp "{}" "dest"
Vysvětlení:
findsoubory v aktuálním adresáři (.) a níže s názvem obsahujícímfoobar(nerozlišují se malá a velká písmena kvůliiv-iname);- pro každý soubor spusťte (
-exec) příkaz k - vytiskněte každou cestu k souboru (
{}) následovaný znakem NUL (\0) jednotlivě (\;); - zaměnit nové řádky a znaky NUL (
tr '\0\n' '\n\0');" - získejte poslední dva řádky (tj. cesty;
tail -n 2,"example@unixlinux.online"); - znovu prohoďte nové řádky a znaky NUL, abyste získali seznam názvů souborů oddělených NUL (
tr '\0\n' '\n\0').
xargs příkaz je trochu těžší vysvětlit. Sestaví tolik cp ... "dest" příkazy podle potřeby, aby se vešly do maximální délky příkazu operačního systému, nahrazující {} token v příkazu se skutečným názvem souboru (-I "{}" ... "{}" ), pomocí znaku NUL jako oddělovače při čtení parametrů (-0 ).
Můžete to zkusit
cp $(find . -iname "*FooBar*" | tail -2 ) dest
find . -iname "*FooBar*"|tail -n2|xargs -i cp "{}" dest
Bohužel to nebude fungovat s názvy souborů, které obsahují mezery nebo nové řádky.