我在一個目錄中有一組檔案。一些檔案名包含八位數的日期,如下所示:
test_file_20220101.txt
...
test_file_20220110.txt
我想使用 shell 腳本來重命名它們,使日期帶有破折號,如下所示:
test_file_2022-01-01.txt
...
test_file_2022-01-10.txt
我有一些 shell 代碼(大部分)在命令列上運行良好(一旦echo被洗掉*):
for f in ./*;
do suffix="${f##*[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]}";
number="${f%"$suffix"}";
number="${number##*[\!0-9]}";
year="${number:0:4}";
month="${number:4:2}";
day="${number:6:2}";
echo mv "$f" "${f/$number/$year-$month-$day}";
done
但是,當我添加#!/bin/sh,#!/bin/bash或#!/bin/zsh在開始時,將其另存為腳本(具有執行權限)并運行腳本,它不會影響檔案名更改,我得到這個stdout:
echo mv ./test_file_20220110 ./test_file_20220110
* 移除回聲沒有任何改變;不希望的結果與 shell 腳本相同。我不相信回聲是問題所在。
我也嘗試過,但沒有成功:用或全部替換”所有’引號’并”洗掉所有引號。所有組合都會產生相同的錯誤腳本輸出。添加運行腳本的輸出對set -v我沒有幫助,但它是:
for f in './*'
suffix=
number=./test_file_20220101
number=
year=
month=
day=
echo mv ./test_file_20220101 ./test_file_20220101
mv ./test_file_20220101 ./test_file_20220101
... [etc.]
配置:
- 默認外殼:
zsh - macOS 12.1“蒙特雷”
另外,作為一項額外的改進,我想解決一個事實,即一些沒有預期的八位數模式的檔案最終被重命名為--other_filename.txt. 在 CLI 中使用上述命令后,我單獨使用以下命令來成功修復此問題。
for f in *; do echo mv -- "$f" "${f##--}"; done
如果這個“cleanup”命令可以與上一次“cleanup”掃描在同一個腳本中,那就太好了。
uj5u.com熱心網友回復:
輸出可能對set -v您沒有幫助,但它告訴我腳本在嘗試從檔案名中提取數字時會橫向移動。至少在 bash 中,這是因為您!在括號運算式中參考了 。也就是說,[\!0-9]匹配 '!'、'0'、'1'、...'9' 集中的一個字符,這不是您想要的。
您應該在命令列中遵守相同的規定,如果您不這樣做,那么我無法解釋。
您腳本的這種變化對我有用:
#!/bin/bash
for f in ./*; do
suffix=${f##*[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]}
number=${f%"$suffix"}
number=${number##*[!0-9]}
year=${number:0:4}
month=${number:4:2}
day=${number:6:2}
echo mv "$f" "${f/${number}/${year}-${month}-${day}}"
done
(除了對括號運算式的更正之外的更改是風格上的,而不是功能性的。)
uj5u.com熱心網友回復:
這個Shellcheck -clean 代碼演示了另一種方法:
#! /bin/bash -p
date_rx='([[:digit:]][[:digit:]][[:digit:]][[:digit:]])([[:digit:]][[:digit:]])([[:digit:]][[:digit:]])'
date_file_rx="(.*)${date_rx}(.*)"
for file in *; do
if [[ $file =~ $date_file_rx ]]; then
prefix=${BASH_REMATCH[1]}
year=${BASH_REMATCH[2]}
month=${BASH_REMATCH[3]}
day=${BASH_REMATCH[4]}
suffix=${BASH_REMATCH[5]}
echo mv -n -v -- "$file" "${prefix}${year}-${month}-${day}${suffix}"
fi
done
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/485033.html
上一篇:使用AWK比較同一列中的值
下一篇:洗掉特定字符和長度后的所有內容
