從檔案名稱遞歸刪除日期和時間

從檔案名稱遞歸刪除日期和時間

我有一個資料夾,其中包含以下形式的文件的資料夾

resultstatsDF_iris_2017-05-26--21-33-35-437096_methodnr-2_percentage-0.05_seed-0.wcr

我想刪除其中每個的日期和時間,所以在這種情況下得到

resultstatsDF_iris_methodnr-2_percentage-0.05_seed-0.wcr

我如何在 bash 中執行此操作?

答案1

如果你真的想做的話“用bash”, 然後

find . -name '*.wcr' -execdir bash -c '
  shopt -s extglob; for f; do echo mv -- "$f" "${f/_+([0-9-])_/_}"; done
' bash {} +

+([0-9-])這依賴於匹配集合中出現的一個或多個字元的擴展 glob[0-9-]

您可以使替換更加具體,例如,${f/_2017+([0-9-])_/_}如果簡單地匹配數字和破折號過於通用。

注意:刪除 echo 一旦你確定它正在做你想做的事。

答案2

使用find+prename(Perl 重新命名)命令:

find yourfolder -type f -name "*.wcr" -exec prename 's/^(.+)_[0-9]{4}-[0-9]{2}-[0-9]{2}[^_]+(_.*)$/$1$2/' {} +

若要查看prename結果而不執行操作,請新增-n選項 (列印要重新命名的檔案的名稱,但不重新命名):

man rename

  • [0-9]{4}-[0-9]{2}-[0-9]{2}- 模式指向日期-like 子字串(例如2017-05-26

答案3

使用Perl 重新命名指令(任一變體,但不是 util-linux rename):

find . -type f -name \*.wcr -exec rename 's/_\d{4}-(\d{2}-){2}-(\d{2}-){3}\d+_/_/' {} +

答案4

如果檔案始終是一層目錄深度,那麼您可以使用類似for x in */*_20*_*.使用哪種模式取決於可能存在您不想重新命名的其他檔案。我剛剛給出的模式假設日期以 開頭20,並且名稱包含的所有文件_20以及之後的另一個取消劃線都應該重命名。

您可以使用 shell 循環進行重新命名參數擴充構造來建構新的檔名。

for old_name in ./*/*_20_*_*; do
  base=${old_name##*/}        # remove the directory part
  prefix=${base%%_20*}        # remove everything from _20
  suffix=${base#*_20}         # remove everything up to _20
  suffix=${suffix#*_}         # ... then everything before the first remaining _
  mv "$old_name" "${old_name%/*}/${prefix}_${suffix}"
done

如果檔案的深度不同,在 bash ≥4.3 中,您可以執行shopt -s globstarthen for x in **/*_20*_*; …。這圖案**globstar如果打開,則符合任何目錄深度。這也適用於 bash 4.0–4.2,但需要注意的是它也會遍歷目錄的符號連結。這也適用於 zsh 和 ksh,無需任何警告,在 zsh 中開箱即用,set -o globstar在 ksh 中也適用。

相關內容