
Ich habe eine Datei, die etwa 20.000 Zeichenfolgen enthält. Jede Zeichenfolge in dieser Datei sollte ein Argument für einen Befehl im Bash-Skript sein.
Zuerst generiert mein Skript eine Datei mit diesen Zeichenfolgen.
find /home/alotoffolders -type f -name "*.mp4" | grep some_greps > ~/tests/find_smth
Danach versuchen wir, eine Variable festzulegen, die Teil des Arguments sein wird.
filename=$(cut -d/ -f11 ~/tests/find_smth)
Dann versuche ich, die gesamte Datei Zeile für Zeile zu lesen und jeden String als Eingabeargument zu verwenden (scheint zu funktionieren), aber bei der Ausgabe gibt es ein Problem.
for i in `cat ~/tests/find_smth`; do ./other_script -input $i -output /home/folder1/folder2/$filename; done
Das Skript kann den statischen Pfad vor $filename nicht sehen.
Wo ist das Problem?
Antwort1
- Benutze niemals
for i in $(cat ...) ...
oder ähnliches. Es durchläuft eine Schleife über Wörter, nicht über Zeilen. Und selbst wenn es das täte, dürfen Dateinamen Zeilenumbrüche enthalten. - VerwendenShell-Parametererweiterungoder
basename
den Befehl, anstattcut
den Dateinamen abzurufen. - Anstatt
grep
für die Ergebnisse von zu verwendenfind
, können Sie zBfind
die Option-regex
oder verwenden-iregex
.
Benutzen find -exec
mit sh -c
:
find /home/alotoffolders -type f -iregex 'some_pattern.mp4' \
-exec sh -c '
/path/to/other_script -input "$1" -output "/home/folder1/folder2/${1##*/}"
' find-sh {} \;