テキストファイルシェルスクリプトのループ

テキストファイルシェルスクリプトのループ

あるディレクトリにファイルのリストがあり、別のディレクトリの各ファイルに対応するjpegセットがあります。すべてのファイルを繰り返し調べて、各ファイル名の宛先ディレクトリを決定する必要があります。

たとえば、およびinというfoo.txt名前のテキストファイルが3つある場合、対応するjpegはおよびにあります。bar.txtbaz.txt/home/userA/folder//home/userA/folder2/foo//home/userA/folder2/bar//home/userA/folder2/baz/

すべてのtxtファイルを繰り返して、対応するターゲットディレクトリをインポートするスクリプトを作成しましたが、エラーが発生します。

bash: /home/userA/folder/File1.txt: syntax error: operand expected (error token is "/home/userA/folder/File1.txt")`

私のスクリプト:

#!/bin/bash
FILES=/home/userA/folder/*.txt
for i in $FILES
do
    str1=$i | cut -d'/' -f5 #to get the name of the file
    echo /home/userA/folder2/$i_filename #I want to include the .txt filename in the output to be like this /home/userA/folder2/Text1_filename    
done

この問題をどのように解決できますか?

答え1

必要なものがファイル名を取得し、それを使用して正しい宛先ディレクトリを取得することであれば、次のことができます。

#!/bin/bash
for i in /home/userA/folder/*.txt
do
    ## Get the file name
    str1="${i##*/}"

    ## Get the target directory
    dir="/home/userA/folder2/${str1%.txt}/"
done

これはシェルを使用する基本です。文字列演算特徴。${var##pattern}最も長い一致は最初から削除され、最も短い一致は最後から削除されます。したがって、ファイル名から最後(パス)まですべてを削除し、最後から文字列を削除します。pattern$var${var%pattern}pattern$var${i##*/}/${i%.txt}.txt

答え2

使用find:

#!/bin/bash
path="/home/userA/folder"
find "$path" -maxdepth 1 -type f -name "*.txt" -print0 | while read -d $'\0' file; do
    a="$path/$(basename $file)/a_%06.jpg"
    echo "$a
done

答え3

echoこの行のバックティックとフィールド番号を忘れました。

    str1=`echo $i | cut -d'/' -f5 `#to get the name of the file

しかし、basenameそれがより良い選択かもしれません。

    str1=`basename $i` #name of the file

このように

#!/bin/bash
FILES=/home/userA/folder/*.txt
for i in $FILES
do
    str1=`basename "$i"` #to get the name of the file
    echo $str1
    ls -l "`dirname "$i"`/$str1"
done

forループと名前にスペースが含まれているファイルを処理するための良い答えについては、以下を参照してください。この回答

答え4

実際に変数に入れるには、bash配列を使用できます。

#!/bin/bash
FILES=(/home/userA/folder/*.txt)
for i in "${FILES[@]}" # double qouting pervents extra word splitting
do
    bn="$(basename "$i")" # to get the name of the file
    a="/home/userA/folder2/$bn/a_%06d.jpg"
done

または単にfor i in /home/userA/folder/*.txt

関連情報