【问题标题】:Exclude File Type From Rename Script从重命名脚本中排除文件类型
【发布时间】:2018-08-17 01:16:12
【问题描述】:

我需要从下面的脚本中排除一个文件类型。谁能告诉我为具有 .partial 扩展名的文件添加和排除什么?

#!/bin/bash
cd /data/user1/upload
thetime=`date +%Y-%m-%d_%H:%M:%S` #
for i in *.*
do
        extn=${i##*.} # save the extension of the file
                mv "$i" "${i%.*}"$(date "+_%Y-%m-%d_%H:%M:%S.${extn}")
done
mv *.* /test/user1

【问题讨论】:

    标签: bash file rename


    【解决方案1】:

    您可以使用 find 并使用正则表达式搜索文件,而不是查找当前路径中的所有文件:

    find . ! -name "*.partial"
    

    这将为您提供所有与“*.partial”正则表达式不匹配的文件。

    【讨论】:

    • 不幸的是,我是 linux 的新手。你能用我提供的脚本给我看一个例子吗?
    • 而不是 for i in *.* 使用 for i in $(find . ! -name "*.partial"); do echo "$i"; done 但是用你想对文件做的任何事情来改变 echo 命令。
    • 使用它后,它会执行所有操作,但名称中包含空格的文件除外。示例 testfile.txt 会根据需要重命名,但 test file1.txt 不会。我怎样才能让脚本也用空格重命名文件?找 。 ! -name "*.filepart" 返回我想要的文件,排除我想要排除的文件,但处理带有空格和单独文件而不是一个文件名的文件。
    【解决方案2】:

    如果你先启用shopt -s extglob,你可以得到所有带有!(*.partial)的非.partial文件。

    【讨论】:

      【解决方案3】:

      您可以在循环中使用检查文件扩展名的保护子句进行过滤,例如:

      for i in *.*
      do
          [[ "$i" =~ \.partial$ ]] && continue
          ...
      done
      

      i 的值以.partial 结尾时,它会转到下一个元素。

      在您的特定情况下,由于您已经提取了扩展值,您可以直接比较它[[ "$extn" == "partial" ]]

      【讨论】:

      • #!/bin/bash cd /data/user1/upload thetime=date +%Y-%m-%d_%H:%M:%S # shopt -s extglob for i in .!(partial) > do > extn=${i ##.} # 保存文件的扩展名 > mv "$i" "${i%.*}"$(date "+_%Y-%m-%d_%H:%M: %S.${extn}") > done mv: cannot stat '*.!(partial)': 没有这样的文件或目录
      • @JT-66 我用不同的方法更新了答案。
      • 完美!谢谢!
      • 有没有办法让上面的脚本完成对多个目录的任务?示例 /data/user1/、data/user2、/data/user3 ?
      • @JT-66 您可以为此使用全局模式,例如data/*/*.*
      猜你喜欢
      • 1970-01-01
      • 2018-03-27
      • 2019-06-04
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      • 2013-03-12
      相关资源
      最近更新 更多