如何查找文件夹中与特定模式匹配(或不匹配)的所有文件?

如何查找文件夹中与特定模式匹配(或不匹配)的所有文件?

如何查找文件夹及其子文件夹中以 3 位数字结尾的所有文件,并将它们移动到新位置,同时保留目录结构?

或者,如何找到名称不以三位数字结尾的所有文件?

答案1

更干净的解决方案,基于 @don_crissti 链接的答案。 (Rsync 过滤器:仅复制一种模式

rsync -av --remove-source-files --include='*[0-9][0-9][0-9]' --include='*/' --exclude '*' /tmp/oldstruct/ /tmp/newstruct/

和否定:

rsync -av --remove-source-files --exclude='*[0-9][0-9][0-9]' /tmp/oldstruct /tmp/newstruct/

原答案:

这应该可以做到。它将在您输入的结构中找到cd以 3 位数结尾的任何文件,在 中创建目标文件夹/tmp/newstruct,然后移动文件。

cd /tmp/oldstruct
find ./ -type f -regextype posix-basic -regex '.*[0-9]\\{3\\}' | 
  while read i; do 
    dest=/tmp/newstruct/$(dirname $i)
    mkdir -vp $dest
    mv -v $i $dest
  done

我建议在实际运行之前添加 and ,以确保它达到您的预期mkdirmvecho

要对 3 位数字求反,只需放置 do! -regex即可。


这是一个依赖 rsync 的更简单的方法。但是,它确实会调用rsync它找到的每个文件,因此效率肯定不是很高。

find ./ -type f -regextype posix-basic -regex '.*[0-9]\{3\}' --exec rsync -av --remove-source-files --relative {} /tmp/newstruct

答案2

您可以使用 bash 执行此操作:

## Make ** match all files and 0 or more dirs and subdirs
shopt globstar
## Iterate over all files and directories
for f in **; do 
    ## Get the name of the parent directory of the 
    ## current file/directory
    dir=$(dirname "$f"); 
    ## If this file/dir ends with 3 digits and is a file
    if [[ $f =~ [0-9]{3} ]] && [ -f "$f" ]; then 
        ## Create the target directory
        mkdir -p targetdir1/"$dir"
        ## Move the file
        mv "$f" targetdir1/"$f" 
    else 
        ## If this is a file but doesn't end with 3 digits
        [ -f "$f" ] && 
        ## Make the target dir
        mkdir -p targetdir2/"$dir" &&
        ## Move the file
        mv "$f" targetdir2/"$f" 
    fi 
done

相关内容