/dir/grouped
是我的路径。grouped
文件夹下通常有两种类型的文件(包含.txt
文件的文件和不包含文件的文件)。例如
/dir/grouped/file1
包含.txt 文件/dir/grouped/file2
不包含.txt 文件
我想从分组中删除 file2(因为它不包含 .txt 文件)。我该如何从终端执行此操作。
答案1
阅读man find
,,,。我会这样解决你的问题man xargs
:man sed
man uniq
- 生成所有目录的列表。您要删除的目录都在此列表中。
- 生成包含文件的所有目录的列表
'*.txt'
。为简单起见,我假设'*.txt'
文件名不包含空格。 - 将两个列表相减,得到不包含文件的目录列表
'*.txt'
。 - 将此列表传递给
echo rm -rfv
。(echo
满意后删除 )
以下是一种方法:
警告我已经将其中的部分内容作为概念验证执行,但不是完成了端到端测试。
# --depth imposes a bottom-up order
find /dir/groupd --depth -type d --print >/tmp/alldir.tmp
# 'sed ...' changes '/dir/groupd/file1/foo.txt' to
# '/dir/groupd/file1'.
# and `uniq` keeps only one, no matter how often '/dir/groupd/file1'
# is generated.
find /dir/groupd --depth --type f -name '*.txt' --print | \
sed -e 's%/[^/]*$%%' | \
uniq >/tmp/txtdir.tmp
#
grep -E -v -f /tmp/txtdir.tmp /tmp/alldir.tmp >/tmp/nontxtdir.tmp
# inspect /tmp/nontxtdir.tmp, or
xargs </tmp/nontxtdir.tmp echo rm -rfv
答案2
您可以使用所有 Bash 功能来实现此目的,此外rm
:
root='/dir/grouped'
# Make globs null if there's no match.
shopt -s nullglob
# For each dir in the root dir
for dir in "$root"/*/; do
# Get array of .txt files.
files=("$dir"*.txt)
# If the array is not empty
if [[ ${#files[@]} -ne 0 ]]; then
echo "Contains .txt files: $dir"
echo rm -rfv "$dir" # Remove 'echo' when done testing.
else
echo "Does not contain .txt files: $dir"
fi
done