Bash

循環生成文件名

  • February 3, 2016

免責聲明:我使用的是 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。我得到的錯誤是輸入帶有文件夾列表,特別是空格“父文件夾”導致錯誤的輸入資訊。

HELP 2:作為第一種情況的擴展,如果我想將文件輸出到與輸入相同的子目錄中,是否必須添加特殊命令?

幫助 3:如果我在每個子目錄中有 2 個文件(input_1.txt 和 input_2.txt),我想將這兩個文件輸入到一個命令中。如果嵌套在 for 循環中,腳本會是什麼樣子?

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

對於輸出,請注意我只需要基本文件名,因為該工具將在名稱末尾附加一個數字來表示第一個和第二個文件輸出和副檔名。出於某種原因,我覺得 for 循環中“in”之後的部分執行不正確。將腳本放在與文件不同的目錄中是一種下意識的解決方案。

任何幫助將不勝感激,贊成,喜歡,接受,收藏。非常感謝您的幫助。

幫助 1

由於空格,您需要引用:

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

INPUT=不過,文件名和文件名之間有一個空格似乎有點奇怪。

幫助 3

如果您有文件input_1.txt,則${file%.txt}_1.txt變為input_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

引用自:https://unix.stackexchange.com/questions/259594