2012-10-18 14 views
21

Molte fonti affermano che ogni istanza di {} sarà sostituito con il nome del file trovato attraverso trovati, ma provo a fare funzionare il seguente, ho solo ottenere un file di testo e il suo nome è ".txt"Utilizza il nome file corrente ("{}") più volte in "find -exec"?

find /directory -name "*pattern*" -exec cut -f8 {} > {}.txt \; 

L'obiettivo era quello di creare un file di testo con solo l'ottava colonna di ogni file trovato, e ogni file di testo sarà chiamato dopo il suo file principale. Qualcosa sul secondo set di {} non sta sostituendo con il nome file di ciascun file trovato.

risposta

22

Prova:

find /directory -name "*pattern*" -exec sh -c 'cut -f8 {} > {}.txt' \; 

ma essere consapevoli che alcune versioni di trovare richiedono {} ad essere un argomento distinti, e non si espanderà {} ad un nome di file altrimenti. È possibile risolvere che, con:.

find /directory -name "*pattern*" -exec sh -c 'cut -f8 $0 > $0.txt' {} \; 

(questo comando alternativo metterà il file di output nella sottodirectory che contiene il file abbinati Se lo si desidera, si potrebbe evitare che reindirizzando a ${0#*/}

La questione è che find non sta facendo il reindirizzamento, il guscio è il tuo comando è esattamente equivalente a:.

# Sample of INCORRECT code 
find /directory -name "*pattern*" -exec cut -f8 {} \; > {}.txt 

Nota quanto segue dalla norma:

Se è presente più di un argomento contenente solo i due caratteri "{}", il comportamento non è specificato.

Se un nome_utensile o una stringa di argomento contiene i due caratteri "{}", ma non solo i due caratteri "{}", è definito dall'implementazione se find sostituisce questi due caratteri o utilizza la stringa senza modifiche.

+0

Vedo, la tua correzione ha funzionato. Grazie! Mi chiedevo se il> veniva interpretato erroneamente – user1757862

10

Per affrontare i caveat che William Pursell menzionato nella sua risposta, utilizzare il seguente:

find /directory -name "*pattern*" -exec sh -c 'cut -f8 "$1" > "$1.txt"' x {} \; 

Quando si utilizza sh -c, ottiene i parametri posizionali da argomenti seguendo la stringa per eseguire . L'extra x compila in $0 e il nome file sostituito diventerà $1.

Le virgolette doppie consentono di funzionare correttamente con nomi di file contenenti spazi e altri caratteri speciali.

+0

+1: bella tecnica –

+0

Qualsiasi motivo per non usare $ 0: 'sh -c '... $ 0 ...' {}'? –

+0

Per lo più sembra semplicemente "sbagliato" - $ 0 dovrebbe essere il nome della shell, non un parametro. Non so quanto sia portatile usarlo lì. – Barmar

1
find /directory -name "*pattern*" | xargs awk '{z=FILENAME".txt";print $8>z}' 
Problemi correlati