在mv命令

时间:2016-03-24 16:50:36

标签: linux bash shell

我有一个目录,其中包含具有以下格式的文件列表:

  • 240 timestamp1.ts
  • 240 timestamp2.ts
  • ...
  • 360 timestamp1.ts
  • 360 timestamp2.ts

现在,我想实现一个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脚本来遍历目录中的所有文件,同时通过更改各自的名称来循环它们,但不知何故我认为单个命令会更有效(即使可读性更低)。

  • 操作系统是Linux Ubuntu 12.04.5
  • shell是bash

感谢您提出的解决方案KenavozKurt Stutsman。你的答案都执行任务;然而,由于我的问题与Kenavoz的答案之间的相似程度,我将Kenavoz的答案标记为已接受的答案。即使确实可以通过省略find命令以更干净的方式进行,但在我的情况下有必要使用相应的命令,因为我需要查找超过X单位时间的文件。再次谢谢你们!

2 个答案:

答案 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