GNU/Linux >> Znalost Linux >  >> Linux

Pipelined Sed nefunguje při nalezeném názvu souboru uvnitř Bash nahrazení příkazu při vyvolání z Find „-exec“?

Tato otázka zde již obsahuje odpovědi :příkaz if v find -exec

(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 {} ';'

Linux
  1. Příkaz nenalezen v Bash Opraveno

  2. Proč substituce procesu Bash nefunguje s některými příkazy?

  3. Proč nefunguje automatické dokončování při zadávání názvu příkazu za „zdroj“?

  1. Příkaz Rm ve skriptu Bash nefunguje s proměnnou?

  2. Příkaz nebyl nalezen v Zsh, ale nalezen v Bash?

  3. bash:netstat:příkaz nenalezen.

  1. sed:příkaz nenalezen

  2. Proč nefunguje find -exec mv {} ./target/ +?

  3. Skript Bash vypíše příkaz Nenalezen na prázdné řádky