我试图通过在bash脚本的目录和子目录中的所有文件(不包括文件夹)的前面添加时间戳来重命名。
从此
/home/user/folder/A.log
/home/user/folder/folder1/B.txt
到
/home/user/folder/2018_5_26_12_10_38_A.log
/home/user/folder/folder1/2018_5_26_12_10_38_B.txt
这是我到目前为止尝试的bash脚本。我想要bash进入subdirectoy。我目前的bash不会进入sub-dirs
cd /home/yolo/filename_test
for i in $(ls -al | grep '^-')
do
mv -T "$i" "$(date -r "$i" +"%Y %m %d %H %M %S" | sed -e 's/ /_/g') "$i""
done
答案 0 :(得分:0)
如果您只需要以递归方式使用文件,则可以使用find
(默认递归)并将标记type
设置为f
这样的事情应该足够了:
cd /home/yolo/filename_test
for f in $(find ./ -type f); do
mv -T "$f" "${f%/*}/$(date -r "$f" +"%Y %m %d %H %M %S" | sed -e 's/ /_/g') "${f##*/}""
done
我没有碰到mv
部分,用你想要的任何东西替换它。
就个人而言,我会使用类似的东西:
mv "$f" "${f%/*}/$(date -r "$f" +"%Y%m%d_%H%M%S")_${f##*/}"
请注意,您不应使用ls
列出周期中的文件,因为文件名可以使用每个字符(包括*
,\n
等),但null
。
答案 1 :(得分:0)
我会用:
find . -type f -execdir bash -c '
echo mv {,$(date +'%Y_%m_%d_%H_%M_%S_')}"${1##*/}" ' _ {} \;
此find
仅f
个,并将目录路径更改为每次-execdir
时找到的文件的路径,并将每个文件的日期重新命名为每个文件一次归档。
${1##*/}
我们从文件中删除了前导./
;并{,$(...)}"${1##*/}"
展开到"${1##*/}" $(...)"${1##*/}"
,传递给mv
重命名文件。