【问题标题】:copy files by length of filename on linux shell在 linux shell 上按文件名长度复制文件
【发布时间】:2014-09-16 11:01:47
【问题描述】:

如何在 linux shell 上按文件名长度复制文件? 我必须将文件名长度为 14 加上扩展名的所有文件从一个非常大的目录复制到另一个目录中。 提前致谢!

【问题讨论】:

    标签: linux file shell


    【解决方案1】:

    您可以使用通配符(文件名扩展):

    • 一个?匹配任何单个字符。
    • A * 匹配任何字符串

    你可以使用 14 吗?和一个 * 用于扩展:

    cp ??????????????.* /you/destination/dir
    

    【讨论】:

    • 请注意,如果在所需长度可能经常变化的脚本中使用连续的?s 可能会很笨拙。您要么每次都必须手动更改它,要么启动一个空字符串变量并将一组?s 附加到循环中的变量。
    • 你说得对,点赞。 14 ?已经很难计算了,你不能轻易地看代码。但是在脚本中使用它是另一种使用情况,原始问题中没有描述。
    【解决方案2】:

    将此find-regex 一起使用:

    find . -regextype posix-extended -regex '\./.{14}\..*' -print0 | xargs -0 -I % cp % /dest/
    
    1. 在 OSX 上,请改用 find -E
    2. 如果您不希望 find 递归,请使用 -maxdepth 1

    【讨论】:

      【解决方案3】:

      如果你想包含目录,你可以这样做:

      for file in *; do
          name="${file%.*}"
          [ ${#name} -eq 14 ] && cp -r "$file" /to/location
      done
      

      仅适用于文件:

      for file in *; do
          name="${file%.*}"
          [ -f "$file" ] && [ ${#name} -eq 14 ] && cp "$file" /to/location
      done
      

      【讨论】:

      • ge 可能有点过于笼统,因为它会匹配比 OP 请求的文件名更长的文件名。试试[ "${file%.*}" -eq 14 ],它会测试文件名的长度,不包括最后的. 及其后面的所有内容。
      • @chepner 不知何故,匆忙中,我误解了“长度 14 加上扩展部分”。感谢您指出。我根据您的建议修复了帖子。
      • 我编辑了您的答案以避免使用 -a 运算符,即使是 POSIX 标准也不推荐。
      • 对于“仅文件”,您实际上不需要测试它是文件还是目录。 cp 只会复制文件并省略任何子目录。这就是为什么需要 -r 来复制子目录。
      • @mxlian 对,但是重点是先看是不是文件,避免下一次测试和cp不必要的处理(返回错误)。
      【解决方案4】:

      使用类似的东西

       case $filename in
         ??????????????.*) 
         # do something with $filename when it has 14 characters and some extension
         ;;
         *)
         # otherwise
         ;;
       esac
      

      您可以将上述内容放入足够的 for filename in * 循环中。

      阅读Advanced Bash Scripting Guideglob(7)

      【讨论】:

        【解决方案5】:

        随便用

        cp ??????????????.* /to/somewhere
           ^^^^^^^^^^^^^^ 14x
        

        【讨论】:

          【解决方案6】:

          你可以简单地使用:

          cp ??????????????.* /destination/directory/path
          

          没有。的 ”?”应该等于您想要的文件名长度。 "*" 包含所有扩展名。

          【讨论】:

            【解决方案7】:
            data_dir=/09ccd9c864194bb2990088348369f291
            cd ${data_dir}
            for f in *
            do
                len=${#f}
                if [ ${len} -le 80 ]  # if the file name is less than 80
                    then
                    echo ${f}
                    # cp your files to some where
                fi
            done
            

            【讨论】:

            • 当添加一个五年前的问题和其他六个答案的答案时,指出您正在解决的问题的新方面很有用。添加解释也很有用,因此您的答案不仅仅是代码答案。在这种特殊情况下,问题是要求文件长度为 14 加扩展名,但您的答案是使用“小于 80”。
            猜你喜欢
            • 2020-09-25
            • 2012-04-09
            • 1970-01-01
            • 2021-08-25
            • 2014-07-08
            • 2019-01-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多