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' | "[email protected]" | 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í:
find
soubory v aktuálním adresáři (.
) a níže s názvem obsahujícímfoobar
(nerozlišují se malá a velká písmena kvůlii
v-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
,"[email protected]"
); - 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.