Linux:删除所有只有一个文件且没有子目录的目录

Linux:删除所有只有一个文件且没有子目录的目录

如何从树中删除符合以下条件的所有目录/子目录:

  1. 目录不包含其他子目录
  2. 目录仅包含一个与此正则表达式模式匹配的文件:^\d{10}.jpg$ (十位数字,扩展名为 .jpg)

执行以下命令将返回所需的文件夹,但也会返回带有子目录的目录

find . -type d -exec sh -c 'set -- "$0"/*.jpg; [ $# -le 1 ]' {} \; -print

答案1

人们对单行脚本很着迷(尽管人们可以编写任意长度的脚本,这通常会使事情更清晰),因此让我首先将其压缩成一行 Bash :-) :

shopt -s globstar; for d in **/; do f=("$d"/*); [[ ${#f[@]} -eq 1 && -f "$f" && "${f##*/}" =~ ^[0-9]{10}\.jpg$ ]] && echo rm -r -- "$d"; done

echo测试期间的安全措施在哪里。

相同的代码,但脚本版本有过多的注释,可读性更强:

#!/bin/bash

# Enable double asterisk globbing (see `man bash`).
shopt -s globstar

# Loop through every subdirectory.
for d in **/; do
    # Glob a list of the files in the directory.
    f=("$d"/*)
    # If
    # 1. there is exactly 1 entry in the directory
    # 2. it is a file
    # 3. the file name consists of 10 digits with a ".jpg" suffix:
    if [[ ${#f[@]} -eq 1 && -f "$f" && "${f##*/}" =~ ^[0-9]{10}\.jpg$ ]]; then
        # `echo` to ensure a test run; remove when verified.
        echo rm -r -- "$d"
    fi
done

匹配是纯 Bash(版本≥4),我相信由于通配符,它​​不易受到“棘手”文件名的影响。默认情况下,它从当前目录运行,但可以对其进行修改以在给定参数、硬编码路径等上运行。


添加:为了以子目录的向后顺序运行以避免必须进行多次迭代(如果这是问题的话),可以先将子目录存储在一个变量中,然后像这样向后遍历它:

#!/bin/bash

# Enable double asterisk globbing (see `man bash`).
shopt -s globstar

# Glob every subdirectory.
subdirs=(**/)

# Loop directories in backwards lexical order to avoid multiple iterations.
for ((i=${#subdirs[@]}; i>0; --i)); do
    d=${subdirs[i-1]}
    # Glob a list of the files in the directory.
    f=("$d"/*)
    # If
    # 1. there is exactly 1 entry in the directory
    # 2. it is a file
    # 3. the file name consists of 10 digits with a ".jpg" suffix:
    if [[ ${#f[@]} -eq 1 && -f "$f" && "${f##*/}" =~ ^[0-9]{10}\.jpg$ ]]; then
        # `echo` to ensure a test run; remove when verified.
        echo rm -r -- "$d"
    fi
done

我认为这将解决评论中的问题,即只有在处理完子目录后某些目录才有资格被删除(我不会更新一行,但每个人都可以自由地这样做:-))。

答案2

保存您的命令的输出和此命令的输出:

ls -lR | awk -F: '!($0 ~ ORS "d") && $0 ORS ~ "-" {print $1}' RS=

(此命令查找没有子目录的目录)

也许可以使用“comm”命令来检查类似的线路?

相关内容