不同文件夹中具有相同名称的文件

时间:2013-06-24 17:05:56

标签: linux bash file shell scripting

我正在寻找一个命令行,它可以对两个名称相同但位于不同文件夹的文件进行一些操作。

例如

  • 文件夹A包含文件1.txt2.txt3.txt,...
  • 文件夹B包含文件1.txt2.txt3.txt,...

我想连接两个文件A/1.txtB/1.txt,以及A/2.txtB/2.txt,...

我正在寻找一个shell命令来做到这一点:

if file name in A is equal the file name in B then: 
    cat A/1.txt B/1.txt
end if

对于文件夹AB中的所有文件,如果只匹配名称。

3 个答案:

答案 0 :(得分:5)

对于简单的事情,下一个语法可能就足够了:

cat ./**/1.txt 

或者你可以简单地写

cat ./{A,B,C}/1.txt

e.g。

$ mkdir -p A C B/BB
$ touch ./{A,B,B/BB,C}/1.txt
$ touch ./{A,B,C}/2.txt

给出

./A/1.txt
./A/2.txt
./B/1.txt
./B/2.txt
./B/BB/1.txt
./C/1.txt
./C/2.txt

echo ./**/1.txt

返回

./A/1.txt ./B/1.txt ./B/BB/1.txt ./C/1.txt

所以

cat ./**/1.txt

将使用上述参数运行cat ...或者

echo ./{A,B,C}/1.txt

将打印

./A/1.txt ./B/1.txt ./C/1.txt #now, without the B/BB/1.txt

依旧......

答案 1 :(得分:4)

尝试此操作以获取具有共同名称的文件:

cd dir1
find . -type f | sort > /tmp/dir1.txt
cd dir2
find . -type f | sort > /tmp/dir2.txt
comm -12 /tmp/dir1.txt /tmp/dir2.txt

然后使用循环来做你需要的任何事情:

for filename in "$(comm -12 /tmp/dir1.txt /tmp/dir2.txt)"; do
    cat "dir1/$filename"
    cat "dir2/$filename"
done

答案 2 :(得分:4)

将遍历文件夹A中的所有文件,如果存在同名B的文件,则cat将同时:

for fA in A/*; do
    fB=B/${f##*/}
    [[ -f $fA && -f $fB ]] && cat "$fA" "$fB"
done

,当然除了cat部分。