【问题标题】:Bash command in order to find common filename and cat their contentBash 命令以查找通用文件名并对其内容进行分类
【发布时间】:2021-03-28 15:48:11
【问题描述】:

您好,我有 3 个目录,例如:

/path1/path2/pathA/path4/

1_to_45.txt 
 ABC
1_to_46.txt
 DEF
1_to_47.txt 
 GHI

/path1/path2/pathB/path4/

1_to_45.txt 
 JKL
1_to_48.txt
 MNO
1_to_47.txt 
 PQR

/path1/path2/pathC/path4/

1_to_45.txt 
 STW
1_to_49.txt
 XYZ
1_to_47.txt 
 AUI
1_to_41.txt 
 IOP

我想将 3 个目录之间共有的所有文件包含到 Merged_directory 目录中,并创建与 comme filename 名称相同的文件 例如,这 3 个目录之间有两个共同的文件:

/path1/path2/Merged_directory

    1_to_45.txt
        ABC
        JKL
        STW
    1_to_47.txt
        GHI
        PQR
        AUI
        
    
      

有人有想法吗?

【问题讨论】:

  • 如果1_to_48.txt 也在/path1/path2/pathC/path4/ 中,您的期望是什么?
  • 没什么,就是在所有目录中。
  • 太棒了cat /path1/path2/path*/*/1_to_45.txt > /path1/path2/Merged_directory/1_to_45.txt?
  • 不,它必须识别文件名匹配......
  • Soo 遍历for i in /path1/path2/path*/*/*.txt - 提取文件名basename $i 然后cat

标签: linux bash file directory


【解决方案1】:

循环遍历一个目录中的文件名。检查其他两个目录中是否也存在相应的名称。如果是这样,请将它们全部归入合并目录。

dir1=/path1/path2/pathA/path4
dir2=/path1/path2/pathB/path4
dir3=/path1/path2/pathC/path4
merged=/path1/path2/Merged_directory
for file in "$dir1"/*.txt
do
    fn=${file##*/}
    if [ -f "$dir2/$fn" ] && [ -f "$dir3/$fn" ]
    then
        cat "$fn" "$dir2/$fn" "$dir3/$fn" > "$merged/$fn"
    fi
done

【讨论】:

  • dir1 包含 pathA 那么为什么是 "$dir1"/pathA/*.txt?
  • 我原本打算只使用一个变量作为公共前缀,然后换档。
猜你喜欢
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-20
  • 2012-07-29
相关资源
最近更新 更多