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

4
我正在寻找一个命令行工具,可以对两个文件进行操作,这两个文件名相同但位于不同的文件夹中。
例如:
  • 文件夹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中的所有文件,仅当名称匹配时。


你想把 cat 的输出放在哪里?你的例子输出到了 stdout,但我不确定这是你的意图。或者对于每一对数据,你有第三个文件吗? - lurker
3个回答

6

尝试使用以下方法获取文件名称相同的文件:

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

你几乎不需要临时文件或 comm。只需循环遍历 dir1 中的文件,并跳过那些不在 dir2 中的文件即可。 - tripleee

6

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

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

and so on...


4
将循环遍历文件夹 A 中的所有文件,如果在文件夹 B 中存在同名文件,则会将两个文件使用 cat 命令合并。
for fA in A/*; do
    fB=B/${f##*/}
    [[ -f $fA && -f $fB ]] && cat "$fA" "$fB"
done

纯粹的 ,当然除了 cat 部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接