sed: impossibile leggere: nessun file o directory di questo tipo


6

Lo uso come str_replace per ogni file nella cartella dopo aver annullato l'archiviazione nella cartella temporanea

find "$tmp" -type f | xargs sed -i "s/${targetsubstring}/${newsubstring}/g"

ma ottengo questo errore:

sed: can't read /tmp/tmp.Q18p8BRYcc/steam: No such file or directory
sed: can't read engine.txt: No such file or directory

Il mio tmp var:

tmp = mktemp -d

Che cosa sto facendo di sbagliato?

AGGIORNARE

archive=`readlink -e $1` #First param is tar archive without file structure (only text files inside)
targetsubstring=$2 #Substring to replace
newsubstring=$3 #Substring to replaced by
tmp=`mktemp -d` #Create a room to unzip our archive

if [ -f "$archive" ]; #Check if archive exist
then
    echo "Well done! (And yeah, I know about [ ! -f '$1' ], but where would be the fun?)" >/dev/null
else
    echo "File doesn't exist! Terminating program." >&2
    exit 1
fi
tar xvf "$archive" -C "$tmp" >/dev/null #Unzip archive to temp folder
find "$tmp" -type f | xargs sed -i "s/${targetsubstring}/${newsubstring}/g" #For every file do str_replace (There is a problem somwhere)
cd  "$tmp" 
tar -zcf "$archive" .  #Zip this to original file (I don't want any folder in my tar file)

2
Potresti spiegare che cosa stai cercando di fare? Capisco solo queste parti: 1) Creare una DIRECTORY. 2) Cerca solo FILES. 3) Metti questa collezione vuota per sedarla usando una pipa.
Hennes

Cosa fa find "$tmp" -type f elenco? Cosa ti aspetti che ritorni? Forse, come ha detto @Hennes, includere la sceneggiatura completa e spiegare qual è lo scopo.
slhck

Codice aggiornato! ..
JohnDow

Risposte:


16

Oh caro, sei una vittima della cosa più terribile del mondo: hai guardato su internet per trovare frammenti di script di shell, ne hai trovati molti, ma non ti è mai stato detto che la maggior parte di loro sono completamente infranti. Molti di loro si rompono se incontrano nomi di file con spazi in essi.

Questo è tipicamente il caso di tutti gli script che analizzano l'output di un comando designato per generare informazioni leggibili dagli esseri umani, ad es. find o ls.

Nel tuo caso, hai il file /tmp/tmp.Q18p8BRYcc/steam engine.txt che contiene uno spazio e che interrompe il tuo comando.

Si prega di considerare l'utilizzo find propriamente , con i suoi -exec interruttore:

find "$tmp" -type f -exec sed -i "s/${targetsubstring}/${newsubstring}/g" {} \;

In questo caso, find volontà -exec ute la parte

sed -i "s/${targetsubstring}/${newsubstring}/g" {}

con il segnaposto {} sostituito dai nomi dei file trovati ... ma sostituito correttamente in un modo che non può bbreak se il nome del file contiene spazi, newline o altri simboli divertenti. Beh, potrebbe rompersi se {} capita di essere sostituito da qualcosa che inizia con un trattino (ma che è improbabile, a meno che la variabile $tmp si espande a una cosa del genere); in questo caso,

sed -i "s/${targetsubstring}/${newsubstring}/g" -- {}

lo farà, se il tuo sed versione supporta il -- opzione ovviamente.

Potresti sostituire il trailing \; (questo significa fine degli argomenti di comando da eseguire ) di + così che sed verrà avviato con tutti gli argomenti che può gestire, quindi non verrà generato una volta per file.


Eppure, c'è un altro modo di usare find sicuro con xargs, usando il -print0 opzione di find e il -0 opzione di xargs:

find "$tmp" -type f -print0 | xargs -0 sed -i "s/${targetsubstring}/${newsubstring}/g"

Grazie mille! Ora vedo che cosa non va con il mio script, e ora vedo un caso, quando anche questo nome di archivio può contenere spazio! (Piace bash.sh "/tmp/tmp.uzIycPFQIL/work/data txt" a A )
JohnDow
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.