如何将两个目录中未复制的所有文件移动到第三个目录中?

如何将两个目录中未复制的所有文件移动到第三个目录中?

因此,我有两个目录,它们都没有子目录,并且只包含文本文件。在一个目录“total”中,所有文本文件都存在。在第二个目录“processed”中,只有“total”中一小部分文件存在。我需要第三个目录“left_to_process”,其中包含 total 中没有processed中的文件。我该怎么做?不幸的是,我们讨论的是数千个文件,因此不建议手动执行此操作...

答案1

这很简单,简单(假设文件名中没有空格或字符):

cd total
for i in * ; do 
  if [[ \! -f ../processed/$i ]] ; then
     echo "$i"
  fi
done | \
  xargs -r mv -t ../left_to_process

您可能需要修复目录。

答案2

这应该会更好:


#!/bin/bash
#
# Collate directory of files to parcel out those already processed.
#
#
Wild_Card="*"

  # Iterate over the wildcard set.
  cd total
  for fname in $Wild_Card
  do
    # Ensure we have at least one matching file, as in we did not get back the wildcard string.
    if [ "$fname" == "$Wild_Card" ]
    then
      echo No files found.
      exit 0
    fi

    # If this file name is not processed, make a copy in the left_to_process directory.
    if [ ! -f ../processed/"$fname" ]
    then
      cp ./"$fname" ../left_to_process/"$fname"
      echo "$fname"
    fi
done

答案3

以下是我的做法...

因为我的理解是你想要计算:

A(总目录文件数)-B(已处理目录文件数)=C(剩余待处理文件数)

您可以创建一个新目录 C,然后将 A 中的所有文件符号链接到 C。接下来,对于 B 中的每个文件,在 C 中的链接上执行 rm 命令。剩下的就是您需要处理的文件。

例如(使用上面定义的 A、B、C)

mkdir C
cd C
ln -s ../A/* ./
for i in ../B/*
do rm `basename "$i"`
done

只需查看lsC 目录即可查看剩余的内容。

相关内容