【问题标题】:Merge two directories keeping larger files合并两个目录以保留较大的文件
【发布时间】:2016-11-01 23:24:20
【问题描述】:

举个例子

mkdir dir1
mkdir dir2

cd dir1
echo "This file contains something" > a
touch b
echo "This file contains something" > c
echo "This file contains something" > d
touch e

cd ../dir2
touch a
echo "This file contains something" > b
echo "This file contains something" > c
echo "This file contains more data than the other file that has the same name but is in the other directory.  BlaBlaBlaBlaBlaBlaBlaBlaBla BlaBlaBlaBlaBlaBlaBlaBlaBla BlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBlaBla. bla!" > d

我想合并dir1dir2。如果两个文件具有相同的名称,则只保留大小最大的一个。这是合并目录的预期内容

a # Comes from `dir1`
b # Comes from `dir2`
c # Comes from either `dir1` or `dir2`
d # Comes from `dir2`
e # Comes from `dir1`(is empty)

【问题讨论】:

  • 你能展示你的尝试吗?目录是递归的吗?

标签: bash file merge directory find


【解决方案1】:

假设没有文件包含换行符:

find . -type f -printf '%s %p\n' \
  | sort -nr \
  | while read -r size file; do
    if ! [ -e "dest/${file#./*/}" ]; then
      cp "$file" "dest/${file#./*/}";
   done

基本上find输出一个filesize path的列表,即:

221 ./dir1/a
1002 ./dir1/b
11 ./dir2/a

此列表按数字排序:

1002 ./dir1/b
221 ./dir1/a
11 ./dir2/a

然后,如果每个文件不在 dest 目录中,则会复制它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 2015-12-05
    相关资源
    最近更新 更多