【问题标题】:bash script renaming all files in current directory as well as all the directories that are above it in hierarchy?bash脚本重命名当前目录中的所有文件以及层次结构中高于它的所有目录?
【发布时间】:2014-09-27 02:10:08
【问题描述】:

我编写了以下脚本来重命名当前目录的所有文件夹中的所有文件。但我遇到了问题,因为它不仅重命名文件夹中的文件,而且还重命名当前目录中的所有文件夹和层次结构中的父目录。我意识到这是因为 .和 .. 存在于当前目录中。但是如何摆脱它们呢?

   for i in *
    do
        cd $i
        for j in *
        do
            mv $j $i$j
        done
        cd ..
    done

问题是,我有很多文件夹,它们包含命名为 image0001 到 image0100 的图像。我想将所有图像复制到一个文件夹中。所以他们正在互相覆盖。这就是我要重命名图像的原因。

【问题讨论】:

  • 我认为 bash 不会扩展 ... 你确定你使用的是 bash 吗? (echo $BASH_VERSION); dotglob 是否启用? shopt dotglob
  • 另外,请添加有关您希望如何重命名文件的更多详细信息。
  • @konsolebox 我在问题中添加了更多细节。并且 dotglob 已关闭。同样在回显 $BASH_VERSION 时,我得到 4.2.25(1)
  • 你可以检查它是否是一个目录。例如:man test
  • 不仅仅是bashPOSIX standard 禁止 * 匹配初始 .

标签: bash


【解决方案1】:

我认为出错的可能是cd $i 有时会失败(可能是因为$i 不是目录?或者可能是因为它包含空格,所以会触发分词?),所以你留在同一个目录中,然后cd .. 将您向上移动一个目录。

要解决此问题(以及可能出现的其他潜在问题),我建议您在编写脚本时更加谨慎:

for dir in */ ; do
    pushd "$dir" || continue
    for file in image???? ; do
        mv "./$file" "${dir%/}$file"
    done
    popd
done

【讨论】:

    猜你喜欢
    • 2010-12-29
    • 2012-05-19
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 2014-05-16
    • 2018-10-29
    • 1970-01-01
    • 2015-08-02
    相关资源
    最近更新 更多