bash スクリプト内のファイルへのパス内の変数

bash スクリプト内のファイルへのパス内の変数

約 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 {} \;

関連情報