bash脚本中的批处理mv或重命名-将日期作为后缀追加

bash脚本中的批处理mv或重命名-将日期作为后缀追加,bash,Bash,经过多次搜索和反复尝试,我无法对文件目录执行批处理mv或rename。我要做的是移动或重命名目录中的所有文件,以便将mv'd或renamed文件的$date(+'%Y%d%m')添加到原始后缀中 所有原始文件都有唯一的前缀,但不是.xml就是.txt,所以我想从org\u prefix.org\u suffix->org\u prefix.org\u suffix.DATE 我试过这个: $ mv /directory/* /directory/*$(date (+ '%Y%m%d') $

经过多次搜索和反复尝试,我无法对文件目录执行批处理
mv
rename
。我要做的是移动或重命名目录中的所有文件,以便将
mv
'd或
rename
d文件的
$date(+'%Y%d%m')
添加到原始后缀中

所有原始文件都有唯一的前缀,但不是
.xml
就是
.txt
,所以我想从
org\u prefix.org\u suffix
->
org\u prefix.org\u suffix.DATE

我试过这个:

$ mv /directory/* /directory/*$(date (+ '%Y%m%d') 
$ for f in *; do mv $ $f.$(date +'_%m%d%y'); done 
$ rename 's/*/.test/' * 
但始终获取
/directory/*.actualdate'不是目录
错误

我试过这个:

$ mv /directory/* /directory/*$(date (+ '%Y%m%d') 
$ for f in *; do mv $ $f.$(date +'_%m%d%y'); done 
$ rename 's/*/.test/' * 
但是我得到
mv:cannotstat'$;没有此类文件或目录

最后,我甚至尝试过:

$ mv /directory/* /directory/*$(date (+ '%Y%m%d') 
$ for f in *; do mv $ $f.$(date +'_%m%d%y'); done 
$ rename 's/*/.test/' * 
只是想看看我是否可以将所有文件更改为
org\u prefix.test
,但什么都没有发生(没有错误,nada,zip)


非常感谢您的帮助。

在当前目录中循环文件(例如打印文件名)的正确方法是:

for file in *; do
    echo "$file"
done
你将如何附加日期?当然,像这样:

for file in *; do
    echo "$file.$(date +%Y%m%d)"
done
for file in *; do
    mv -nv -- "$file" "$file.$(date +%Y%m%d)"
done
那你打算怎么做呢?当然,像这样:

for file in *; do
    echo "$file.$(date +%Y%m%d)"
done
for file in *; do
    mv -nv -- "$file" "$file.$(date +%Y%m%d)"
done
我补充说:

  • -v
    这样
    mv
    就变得冗长了(我喜欢知道发生了什么,我的小妹妹看到屏幕上的这些台词总是印象深刻)
  • -n
    以避免覆盖其他现有文件。安全第一
  • --
    为了防止文件名以连字符开头:如果没有
    --
    mv
    会与选项混淆。安全第一
如果您只想查看扩展名为
.banana
的文件,请将的
替换为:

for file in *.banana; do
对于包含单词
banana
的文件:

for file in *banana*; do
等等

跟上香蕉

$ mv /directory/* /directory/*$(date (+ '%Y%m%d')
这不起作用,因为
*
已展开为所有文件的列表,因此展开后,命令类似于:

mv /directory/file1 /directory/file2 /directory/file3 /directory/file1_date /directory/file1_date ...
所以您指定了许多目的地,但是mv的语法只允许一个目的地

for f in *; do mv $ $f.$(date +'_%m%d%y'); done
在这里,您忘记了
$
之后的
f
,这就是为什么您会收到错误消息

for f in *; do mv $f $f.$(date +'%m%d%y'); done
我认为现在应该可以了,但别忘了引用所有的变量

最后:

for f in *; do mv "$f" "$f.$(date +'%m%d%y')"; done
编辑:当变量后面直接有字符时,最好使用
{}
来明确它们不是变量名称的一部分:

for f in *; do mv "$f" "${f}.$(date +'%m%d%y')"; done

谢谢你,它也很管用。如果我想把它放到bash脚本中,并从cron作业调用它,正确的语法是:for file in/some_directory/*;do mv-nv--“$file”“/new_目录$file$(日期+%Y%m%d)”done@user2755742如果它是从cronjob调用的,则不需要
-v
开关,除非您想记录此输出。除此之外,一切都很好!(在将脚本放入crontable之前,请尝试该脚本,以检查是否一切正常)。