在linux shell上按文件名长度复制文件

时间:2014-09-16 11:01:48

标签: linux file shell

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

7 个答案:

答案 0 :(得分:3)

您可以使用globbing(文件名扩展):

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

你可以使用14吗?和* *为扩展名:

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

答案 1 :(得分:2)

将此find-regex

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

答案 2 :(得分:1)

使用类似

的内容
 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)

答案 3 :(得分:1)

只需使用

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

答案 4 :(得分:1)

您可以简单地使用:

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

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

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