我试图加密我们的语法Nas上的一个文件夹,但是已经发现了大约250个文件名超过143个字符。我是否可以使用任何命令从文件名的末尾删除所有字符,使其长度小于143个字符。
我用来查找文件的命令
find . -type f -name '???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????*'
我希望能够导航到8-9个左右的目录,这些目录保存这些文件块,并能够运行一行代码,找到名字大于n个字符的文件,并删除多余的字符,使其低于143个字符。
发布于 2021-10-05 04:33:54
我不熟悉语法,但是如果您有一个接受Perl regex替换的rename
命令,并且您可以假设同一个目录中没有两个文件具有相同的143个字符前缀(或者在本例中丢失其中一个是可以接受的),我想如下所示
find . -type f -regex '.*/[^/]\{143\}[^/]+' -exec rename 's%([^/]{143})[^/]+$%$1%' {} +
如果您没有这个版本的非标准rename
命令,最简单的解决方案可能是将find
的输出输送到Perl,然后将其输送到sh
。
find . -type f -regex '.*/[^/]\{143\}[^/]+' |
perl -pe 's%(.*/)([^/]{143})([^/]+)$%mv "$1$2$3" "$1$2"' |
sh
如果您无法访问Perl,则可以将相同的脚本重构到sed
命令中,尽管regex将略有不同,因为它们讲不同的方言。
find . -type f -regex '.*/[^/]\{143\}[^/]+' |
sed 's%\(.*/\)\([^/]\{143\}\)\([^/]\+\)$%mv "\1\2\3" "\1\2"' |
sh
对于您的文件名,这有一些幼稚的假设--如果它们可以包含换行符或双引号,则需要更可靠的内容(参见https://mywiki.wooledge.org/BashFAQ/020)。粗略地说,也许可以试试
find . -type f -regex '.*/[^/]\{143\}[^/]+' -exec bash -c 'for f; do
g=${f##*/}
mv -- "$f" "${f%/*}/${g:0:143}"
done' _ {} +
https://stackoverflow.com/questions/69444003
复制相似问题