我正在嘗試加密 Synology Nas 上的檔案夾,但發現大約 250 個檔案名長度超過 143 個字符。是否有任何命令可以用來洗掉檔案名末尾的所有字符,使其長度小于 143 個字符。
我用來查找檔案的命令
find . -type f -name '???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????*'
我希望能夠導航到包含這些檔案塊的 8-9 個左右的目錄,并且能夠運行一行代碼來找到名稱長于n 個字符的檔案并洗掉額外的字符以獲取它143.
uj5u.com熱心網友回復:
我不熟悉 Synology,但是如果您有一個rename接受 Perl 正則運算式替換的命令,并且假設同一目錄中沒有兩個檔案具有相同的 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命令,但正則運算式會略有不同,因為它們使用不同的方言。
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://www.uj5u.com/houduan/317382.html
