【发布时间】:2014-09-16 11:01:47
【问题描述】:
如何在 linux shell 上按文件名长度复制文件? 我必须将文件名长度为 14 加上扩展名的所有文件从一个非常大的目录复制到另一个目录中。 提前致谢!
【问题讨论】:
如何在 linux shell 上按文件名长度复制文件? 我必须将文件名长度为 14 加上扩展名的所有文件从一个非常大的目录复制到另一个目录中。 提前致谢!
【问题讨论】:
您可以使用通配符(文件名扩展):
你可以使用 14 吗?和一个 * 用于扩展:
cp ??????????????.* /you/destination/dir
【讨论】:
?s 可能会很笨拙。您要么每次都必须手动更改它,要么启动一个空字符串变量并将一组?s 附加到循环中的变量。
将此find 与-regex 一起使用:
find . -regextype posix-extended -regex '\./.{14}\..*' -print0 | xargs -0 -I % cp % /dest/
find -E。find 递归,请使用 -maxdepth 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
【讨论】:
ge 可能有点过于笼统,因为它会匹配比 OP 请求的文件名更长的文件名。试试[ "${file%.*}" -eq 14 ],它会测试文件名的长度,不包括最后的. 及其后面的所有内容。
-a 运算符,即使是 POSIX 标准也不推荐。
cp不必要的处理(返回错误)。
使用类似的东西
case $filename in
??????????????.*)
# do something with $filename when it has 14 characters and some extension
;;
*)
# otherwise
;;
esac
您可以将上述内容放入足够的 for filename in * 循环中。
【讨论】:
随便用
cp ??????????????.* /to/somewhere
^^^^^^^^^^^^^^ 14x
【讨论】:
你可以简单地使用:
cp ??????????????.* /destination/directory/path
没有。的 ”?”应该等于您想要的文件名长度。 "*" 包含所有扩展名。
【讨论】:
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
【讨论】: