ループ内のファイル名の生成 [閉じる]

ループ内のファイル名の生成 [閉じる]

免責事項:私はMac OSXを使用しています。 Bashスクリプトは、処理する必要があるファイルとは異なるディレクトリにあります。これから私の闘争は始まります...

ヘルプ1:バイオインフォマティクスツールの入力ファイルとして使用する必要があるファイルが複数あり、各ファイルは親ディレクトリのサブディレクトリにあります。 forループがこの問題を解決できることがわかりました。

for file in ~/Desktop/parent\ folder/*/*.txt;
do exTool INPUT= ${file##*/} OUTPUT= ${file%.txt}_exd.txt 

ファイルを入力し($ fileに追加されたフォルダのリストを切り取る)、ファイルを出力して「.txt」を削除して_exd.txtを追加したいと思います。私が得るエラーは、入力がフォルダのリストを渡すことです。特に、「親\フォルダ」の空白が原因で誤った入力情報が発生することです。

ヘルプ2:最初のケースの拡張で、入力と同じサブディレクトリにファイルを出力するには特別なコマンドを追加する必要がありますか?

ヘルプ3:各サブディレクトリに2つのファイル(input_1.txt、input_2.txt)があり、2つのファイルを1つのコマンドに入力したい場合です。 forループ内にネストされている場合、スクリプトはどのように見えますか?

for file in ~/Desktop/parent\ folder/*/*.txt;
do bioTool INPUT1= ${file%.txt}_1.txt INPUT2= ${file%.txt}_2.txt OUTPUT= ${file%%.*}

出力の場合、ツールは最初のファイルと2番目のファイルの出力と拡張子を表すために名前の末尾に数字を追加するため、デフォルトのファイル名のみが必要であることに注意してください。なぜかforループの"in"次の部分が間違って行われたような感じがします。これは無謀な解決策です。スクリプトをファイルとは別のディレクトリに配置します。

どんな助けでも非常に感謝します。好きで、好きで、受け入れて、お気に入りにします。助けてくれてありがとう。

答え1

ヘルプ1

空白のため、以下を引用する必要があります。

INPUT= "${file##*/}" OUTPUT= "${file%.txt}"_exd.txt

INPUT=ところで、ファイル名とファイル名の間に空白があるのがちょっとおかしいようです。

ヘルプ3

input_1.txtファイルがあれば${file%.txt}_1.txtinput_1_1.txt

正しいファイル名と一致します。

for file in ~/Desktop/parent\ folder/*/input_1.txt; do
    bioTool INPUT1= "${file}" INPUT2= "${file%_1.txt}_2.txt" OUTPUT= "${file%%.*}"
done

ヘルプ4

それはまったく空の殻ではありません。

サブディレクトリに変更

for file in ~/Desktop/parent\ folder/*/input_1.txt; do
    subdir="${file%/*}"
    pushd "$subdir" &>/dev/null
    file="${file##*/}"
    bioTool INPUT1= "${file}" INPUT2= "${file%_1.txt}_2.txt" OUTPUT= "${file%%.*}"
    popd &>/dev/null
done

関連情報