2013-06-24 308 views
2

我正在查找可以對具有相同名稱但在不同文件夾中的兩個文件執行一些操作的命令行。在不同文件夾中具有相同名稱的文件

例如如果

  • A包含文件1.txt2.txt3.txt,…
  • 文件夾B包含文件1.txt,2.txt,3.txt,......「

我想將兩者連接起來的文件A/1.txtB/1.txtA/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所有文件,如果只有名稱匹配。

+0

你想去哪裏了'cat'的輸出去?你的例子轉到'stdout',但我不確定這是你的意圖。或者你有每個對的第三個文件? – lurker

回答

1

試試這個讓具有共同名稱的文件:

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 
+0

你幾乎不需要臨時文件或'comm'。只需在'dir1'中循環文件並跳過那些不在'dir2'中的文件。 – tripleee

+0

是的你是對的,它也漸漸地慢了起來 – simonzack

4
通過文件夾 A所有文件

將循環,並如果B中存在同名文件,則將cat都設爲:

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

Pure ,當然除了cat部分。

+0

+1非常漂亮! –

5

對於簡單的事情也許就足夠了旁邊的語法:

cat ./**/1.txt 

,或者你可以簡單的寫

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

例如

$ 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 

等等...

相關問題