在循环中生成文件名

在循环中生成文件名

免责声明:我使用的是 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),并且我想将这两个文件输入到单个命令中。如果脚本嵌套在 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

帮助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

相关内容