从目录中删除不包含.txt文件的文件夹

从目录中删除不包含.txt文件的文件夹

/dir/grouped是我的路径。grouped文件夹下通常有两种类型的文件(包含.txt文件的文件和不包含文件的文件)。例如

  • /dir/grouped/file1包含.txt 文件
  • /dir/grouped/file2不包含.txt 文件

我想从分组中删除 file2(因为它不包含 .txt 文件)。我该如何从终端执行此操作。

答案1

阅读man find,,,。我会这样解决你的问题man xargsman sedman uniq

  1. 生成所有目录的列表。您要删除的目录都在此列表中。
  2. 生成包含文件的所有目录的列表'*.txt'。为简单起见,我假设'*.txt'文件名不包含空格。
  3. 将两个列表相减,得到不包含文件的目录列表'*.txt'
  4. 将此列表传递给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

相关内容