
約 20,000 個の文字列を含むファイルがあります。そのファイル内の各文字列は、bash スクリプト内のコマンドの引数である必要があります。
最初に、私のスクリプトは次の文字列を含むファイルを生成します。
find /home/alotoffolders -type f -name "*.mp4" | grep some_greps > ~/tests/find_smth
その後、変数を設定しようとすると、それが引数の一部になります
filename=$(cut -d/ -f11 ~/tests/find_smth)
次に、すべてのファイルを 1 行ずつ読み取り、すべての文字列を入力引数として使用しようとします (動作するように見えますが)。ただし、出力に関しては問題が発生します。
for i in `cat ~/tests/find_smth`; do ./other_script -input $i -output /home/folder1/folder2/$filename; done
スクリプトは $filename の前の静的パスを認識できません。
問題はどこだ?
答え1
- 絶対に使用しないでください
for i in $(cat ...) ...
または類似のものです。これは行ではなく単語をループします。また、たとえ行をループする場合でも、ファイル名に改行を含めることができます。 - 使用シェルパラメータの拡張または
basename
コマンドの代わりにcut
ファイル名を取得します。 grep
の結果に対して を使用する代わりに、たとえば のまたはオプションfind
を使用することもできます。find
-regex
-iregex
find -exec
一緒に使用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 {} \;