【问题标题】:Backup file loop in bashbash 中的备份文件循环
【发布时间】:2012-10-11 18:09:06
【问题描述】:

我正在编写一个脚本,它获取一个目录,将其中的所有文件复制到一个新目录中,然后重命名新目录中的所有文件,以在其名称中包含 -BACKUP 在扩展名之前。

到目前为止我有:

dir1=$1
dir2=$2

mkdir $dir2
cp -r $dir1/. $dir2

for i in $dir2
do
file=$(basename "$i")
b=${file%.*}
c=${file#"$stub"}
d=-BACKUP
e=$b$d$c
mv $i $e

done

虽然这只会更改目录的名称,而不是目录中的所有文件。

我做错了什么,您将如何处理?

【问题讨论】:

    标签: bash loops


    【解决方案1】:

    您需要进行一些全球性的活动:

    for i in "$dir2"/*
    

    (请注意,这不会捕获 .dotfiles,并且会枚举文件和目录,因此如果其中任何一个有问题,您可能需要更多逻辑。)

    如果您预计复制后$dir2 可能为空,请添加:

    shopt -s nullglob
    

    for 之前,这样循环就不会在这种情况下运行。 (否则你会在$i 中得到$dir2/*,这是不可取的。)

    mv $i $e
    

    不起作用,因为$e 不包含您构建它的方式的路径。试试:

    mv "$i" "$dir2/$e"
    

    (如果您希望文件名中包含空格,则应引用所有这些变量。)

    【讨论】:

    • 由于某种原因,现在我的目录是空的。
    • 您的mv 命令错误,应该是mv $i $dir2/$e - 您的所有文件现在都应该在当前目录中...
    • 我收到此错误:mv: cannot move `testdir' to a subdirectory of itself, `testdir/i-BACKUPi' 并且新目录中的文件仍然没有被更改。
    • 添加了一条关于对空目录运行此命令的注释,这可能会执行您所描述的那种事情 - 但您的替换中必须有其他错误才能生成该名称。跨度>
    【解决方案2】:

    我会在支持它的系统上使用findrename

    cp -R "$dir1" "$dir2"
    find "$dir2" | xargs rename 's/$/-BACKUP/'
    

    【讨论】:

    • 仅供参考 -- rename 不是标准的,不同的操作系统包含不同版本的命令,具有不同的用法(或者,许多根本没有实现)。
    • 好的,感谢您的提醒!可能不便携,但是很实用=)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 2010-12-04
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多