通过添加文件前面的时间戳,仅重命名目录和子目录中的文件

时间:2018-06-03 08:35:03

标签: bash

我试图通过在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

2 个答案:

答案 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##*/}" ' _ {} \;

findf个,并将目录路径更改为每次-execdir时找到的文件的路径,并将每个文件的日期重新命名为每个文件一次归档。

${1##*/}我们从文件中删除了前导./;并{,$(...)}"${1##*/}"展开到"${1##*/}" $(...)"${1##*/}",传递给mv重命名文件。