【问题标题】:how to rename multiple files in unix如何在unix中重命名多个文件
【发布时间】:2014-09-25 00:27:05
【问题描述】:

我想使用 shell 脚本重命名一个目录中的多个文件 这些文件有共同的前缀:

Modify: 2014-09-19 16:08:35.000000000 +0300-16:08:35.000000000-OCS_dmobfw1-oam_d04_20140919_155335.csv
Modify: 2014-09-19 16:09:23.000000000 +0300-16:09:23.000000000-OCS_dmobfw1-oam_d01_20140919_155423.csv
Modify: 2014-09-19 16:09:51.000000000 +0300-16:09:51.000000000-OCS_dmobfw1-oam_d09_20140919_155451.csv
Modify: 2014-09-19 16:12:40.000000000 +0300-16:12:40.000000000-OCS_dmobfw1-oam_d07_20140919_155740.csv
Modify: 2014-09-19 16:14:48.000000000 +0300-16:14:48.000000000-OCS_dmobfw1-oam_d05_20140919_155948.csv
Modify: 2014-09-19 16:18:14.000000000 +0300-16:18:14.000000000-OCS_dmobfw1-oam_d03_20140919_160314.csv
Modify: 2014-09-19 16:18:15.000000000 +0300-16:18:15.000000000-OCS_dmobfw1-oam_d08_20140919_160315.csv

我想从所有文件中删除以下部分:

修改:2014-09-19 16:08:35.000000000 +0300-16:08:35.000000000-

所以输出可以是这样的:

OCS_dmobfw1-oam_d01_20140423_223805.csv OCS_dmobfw1-oam_d01_20140423_223905.csv

我试过了:

 for name in Modify* ;
do
 mv "$name"  $(echo $name | sed 's/Modify: 2014-09-19 16:18:14.000000000 +0300-16:18:14.000000000-/ /g') ;
done

【问题讨论】:

  • 您没有告诉我们您的方法有什么问题,但是由于您的文件名包含空格(不要这样做),您会遇到麻烦。使用find 可能是最安全的选择。
  • 你能告诉我更多关于如何在我的情况下使用 find 吗?

标签: shell unix


【解决方案1】:

例如:

for name in Modify*
do
    echo mv "$name" "$(sed -E 's/Modify: .{55}//'<<<"$name")"
done

如果满意就移除回声..

&lt;&lt;&lt; 是 bash 扩展,如果你没有 bash 使用

    echo mv "$name" "$(echo "$name" | sed -E 's/Modify: .{55}//')"

如果每个文件都包含OCS,您可以使用较短的:

    echo mv "$name" "$(grep -o 'OCS.*' <<<"$name")"

【讨论】:

  • 最后一个编辑工作正常,谢谢,但前两个不工作。
  • @MohamedYasser 在这种情况下,您的 sed 不知道 -E不工作没有帮助,很高兴知道错误是什么 - 用于纠正......
【解决方案2】:
for name in Modify* ;
do
    new=`echo $name | sed 's/Modify: 2014-09-19 16:18:14.000000000 +0300-16:18:14.000000000-//g'`; 
    mv $name $new;
done

【讨论】:

    【解决方案3】:

    您接受的答案可能更简单,至少同样好,但您可以使用find 来做到这一点。

    find . -mindepth 1 -maxdepth 1 -name 'Modify*' -execdir sh -c 'mv -n "$@" "$(echo "$@" | sed "s,Modify: .\{55\},,")";' -- '{}' \;
    

    如果您想递归到子目录,这种方法将是最有用的。在这种情况下,请删除 -maxdepth 1 选项。

    您最初尝试的关键问题是您的文件名都有不同的时间戳,但您只是替换了一个特定的时间戳。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-20
      • 2015-07-19
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 2018-05-31
      相关资源
      最近更新 更多