因此,我有两个目录,它们都没有子目录,并且只包含文本文件。在一个目录“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
只需查看ls
C 目录即可查看剩余的内容。