使用 find 将目录重命名为垃圾目录

使用 find 将目录重命名为垃圾目录

以下是检查路径中超过 1 天且与名称条件匹配的任何文件夹。如果找到,该文件夹将被移至“垃圾箱”文件夹。

find /Users/myname/Desktop/backups/websites/testwebsite.co.uk -maxdepth 1 -type d -mtime +1 -name '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' -exec mv {} /Users/myname/Desktop/backups/trash \;

我需要修改文件夹名称,在末尾包含“_renamed”。

我以为我可以使用 mv 中的花括号,但现在意识到这也需要完整的文件夹路径。

find /Users/myname/Desktop/backups/websites/testwebsite.co.uk -maxdepth 1 -type d -mtime +1 -name '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' -exec mv {} /Users/myname/Desktop/backups/trash/{}_renamed \;

有什么方法可以修改文件夹路径而不复制路径吗?

答案1

是的,find适用于路径名,而不是文件名。

有两个直接的解决方案:

  1. 您可以提取路径名的文件名部分,并将其用于mv.

    find /Users/myname/Desktop/backups/websites/testwebsite.co.uk \
        -maxdepth 1 -type d -mtime +1 \
        -name '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' \
        -exec sh -c 'mv "$1" "/Users/myname/Desktop/backups/trash/${1##*/}_renamed"' sh {} ';'
    

    这里,${1##*/}与 相同$( basename "$1" ),是 给脚本$1的路径名。sh -cfind

  2. 如果您的实现支持它,您可以使用-execdir它来代替。使用 时,给定的命令将在找到的项目的父文件夹中执行,并且将是项目的基本名称(使用 BSD )或前缀为基本名称(使用 GNU )。-execfind-execdir{}find./find

    find /Users/myname/Desktop/backups/websites/testwebsite.co.uk \
        -maxdepth 1 -type d -mtime +1 \
        -name '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' \
        -execdir mv {} /Users/myname/Desktop/backups/trash/{}_renamed ';'
    

有关的:

相关内容