我有一个目录,其中包含具有以下格式的文件列表:
现在,我想实现一个bash命令,该命令匹配以'240'开头的文件并重命名它们,以便代替'240-timestampX.ts',文件看起来像 '240人可读-timestampX.ts'
我尝试了以下内容:
find . -maxdepth 1 -mmin +5 -type f -name "240*"
-exec mv $0 {$0/240-***and here I want to insert
either stat -c %y filename or date -d @timestampX***} '{}' \;
我卡在这里是因为我不知道是否可以在mv命令中嵌入bash命令。我知道任务可能看起来有点令人困惑和过于复杂,但我想知道是否有可能这样做。当然我可以创建一个bash脚本来遍历目录中的所有文件,同时通过更改各自的名称来循环它们,但不知何故我认为单个命令会更有效(即使可读性更低)。
感谢您提出的解决方案Kenavoz和Kurt Stutsman。你的答案都执行任务;然而,由于我的问题与Kenavoz的答案之间的相似程度,我将Kenavoz的答案标记为已接受的答案。即使确实可以通过省略find命令以更干净的方式进行,但在我的情况下有必要使用相应的命令,因为我需要查找超过X单位时间的文件。再次谢谢你们!
答案 0 :(得分:3)
如果您想保留mmin
选项,可以使用find
并使用xargs
使用bash命令处理找到的文件:
find . -maxdepth 1 -mmin +5 -type f -name "240*.ts" | xargs -L 1 bash -c 'mv "${1}" "240-$(stat -c %y ${1}).ts"' \;
答案 1 :(得分:2)
如果所有文件都在一个目录中,则在bash中,您根本不需要使用find
。你可以做一个for循环:
for file in 240-*; do
hr_timestamp=$(date -d $(echo "$file" | sed 's/.*-\([0-9]*\)\.ts/\1/'))
mv "$file" "240-$hr_timestamp.ts"
done