(2 odpovědi)
Uzavřeno před 11 měsíci.
Vypadá to, že „find“, „bash“ a „sed“ v některých případech nefungují tak, jak by se dalo očekávat.
Následující příklad by měl nejprve vytvořit soubor ‚sample.txt‘, poté soubor najít a nakonec zpracovat příkazem ‚-exec‘. Provedený příkaz vytiskne nalezený název souboru, testovací vzorky a upravený název souboru. Samotný příkaz „sed“ se používá k nahrazení „txt“ za „TXT“.
touch sample.txt
find ./ -maxdepth 1 -name "*.txt" -exec echo {} $(echo Specimen_before.txt {} Specimen_after.txt |sed -e "s/txt/TXT/g") ;
Očekávaný výstup je:
./sample.txt Specimen_before.TXT ./sample.TXT Specimen_after.TXT
Místo toho produkuje:
./sample.txt Specimen_before.TXT ./sample.txt Specimen_after.TXT
(příklad byl testován také se starým nahrazováním příkazů pomocí zpětných uvozovek „`“ se stejným výsledkem)
Co dělám špatně?
Přijatá odpověď:
Náhrada příkazu se provede před find
dokonce začíná. Skutečně provedený příkaz (po nahrazení, rozšíření a odstranění citací atd.) je
find ./ -maxdepth 1 -name *.txt -exec echo {} Specimen_before.TXT {} Specimen_after.TXT ;
Pokud potřebujete spustit cokoli fancy (potrubí nebo více příkazů) s -exec
, pak spusťte samostatný shell, abyste to udělali:
find . -maxdepth 1 -type f -name '*.txt'
-exec sh -c 'printf "%s " "$1"; printf "%s %s %sn" "before.txt" "$1" "after.txt" | sed "s/txt/TXT/g"' sh {} ';'