关于Linux:bash如何对两个目录中的文件执行命令

Bash How to execute a command for files in two directories

我知道这个bash代码用于对一个目录中的所有文件执行操作:

1
2
for files in dir/*.ext; do
cmd option"${files%.*}.ext" out"${files%.*}.newext"; done

但现在,我必须对一个目录中的所有文件执行一个操作,其中另一个目录中的所有文件都具有相同的文件名,但扩展名不同。例如

1
2
3
4
5
directory 1 -> file1.txt, file2.txt, file3.txt
directory 2 -> file1.csv, file2.csv, file3.csv

cmd file1.txt file1.csv > file1.newext
cmd file2.txt file2.csv > file2.newext

我不能比较两个文件,但是我必须执行的脚本需要两个文件来生成另一个文件(特别是我必须执行bwa samsa path_to_ref/ref file1.txt file1.csv > file1.newext

你能帮我吗?

谢谢你的回答!


在使用变量操作的bash中:

1
2
3
4
$ for f in test/* ; do t="${f##*/}";  echo"$f" test2/"${t%.txt}".csv ; done
test/file1.txt test2/file1.csv
test/file2.txt test2/file2.csv
test/file3.txt test2/file3.csv

编辑:

执行@davidc.rankin的保险建议:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ touch test/futile
for f in test/*
do
  t="${f##*/}"
  t="test2/${t%.txt}".csv
  if [ -e"$t" ]
  then
    echo"$f""$t"
  fi
done
test/file1.txt test2/file1.csv
test/file2.txt test2/file2.csv
test/file3.txt test2/file3.csv


尝试:

1
2
3
4
for file in path_to_txt/*.txt; do
   b=$(basename $file .txt)
   cmd path_to_txt/$b.txt path_to_csv/$b.csv
done
  • 如果此命令不需要路径,则不要在对"cmd"的调用中包含这些路径。
  • 如果在.txt文件目录下运行,则"for"语句不能包含路径。
  • 如果需要执行时间,可以用posix regexp替换basename。请参阅此处https://stackoverflow.com/a/2664746/4886927