簡體   English   中英

如何在子目錄中查找匹配模式和替換模式的所有文件

[英]How to find all files in subdirectories that match pattern and replace pattern

我試圖將我的一些視頻文件移動到新的子目錄中,同時也在我的 Unraid 系統上重命名它們。 這些文件都遵循類似的命名約定:

featurette name-featurette.mkv

我想將這些文件從它們的當前目錄移動到一個子目錄並像這樣重命名它們:

featurettes/featurette name.mkv 

我能夠使用 find 和 execdir 創建目錄並重新定位文件:

find . -type f -name *-featurette.mkv -maxdepth 2 -execdir mkdir ./featurettes/ \;
find . -type f -name *-featurette.mkv -maxdepth 2 -execdir mv {} ./featurettes/ \;

我正在為重命名作品而苦苦掙扎。 我已經嘗試了重命名命令,但無法讓它在 featurettes 目錄中工作,更不用說從上面的兩個目錄中工作了,這是我想要執行命令的地方。 我在 featurettes 目錄中嘗試了以下命令:

rename \-featurette.mkv .mkv *

但是我收到錯誤:

invalid option -- 'f'

我認為通過逃避破折號我可以避免這個問題,但它似乎不起作用。 關於如何從匹配它的子目錄中的所有文件中刪除此模式的任何建議將不勝感激。

man rename您可以看到此命令獲取選項和 3 個位置參數:

大綱重命名 [選項] 表達式替換文件...

所以在你的情況下,第一個參數被解釋為一個選項。 您可以使用以下語法:

rename -- '-featurette' '' *-featurette.mkv

重命名文件。 --表示任何選項都結束了,后面的只是位置參數。


總而言之,用一個mv進程復制文件並重命名它們:

mkdir -p target/dir
find . -maxdepth 2 -type f -name "*-featurette.mkv" -exec mv -t target/dir {} +
cd target/dir && rename -- '-featurette' '' *-featurette.mkv

如果要重命名位於不同子目錄中的許多文件,可以使用以下語法:

find . -name "*-featurette.mkv" -print0 | xargs -r0 rename -- '-featurette' ''  
find . \
  -maxdepth 2 \
  -type f \
  -name '*-featurette.mkv' \
  -execdir sh -c '
echo mkdir -p ./featurettes/
echo mv -- "$@" ./featurettes/
' _ {} \+

我修復或改進的實現問題:

  • -maxdepth 2必須在-type f之前
  • -name '*-featurette.mkv'必須引用模式以防止 shell 擴展它。
  • -execdir最好與內聯 shell 一起使用,因此它也可以處理來自同一目錄的多個參數

還要記住,在使用-execdir運行命令時, findcd到該目錄。 這意味着mv -- "$@" ./featurettes/'將文件移動到./featurettes/'相對目錄是-execdir剛剛cd

移動時也重命名文件的版本:

(沒有echo干運行保護,因此只有在您確定它可以滿足您的需求時才使用)

#!/usr/bin/env sh

find . \
  -maxdepth 2 \
  -depth \
  -name '*-featurette.mkv' \
  -type f \
  -execdir sh -c '
mkdir -p featurettes
for arg
do
  basename=${arg##*/}
  mv -- "$basename" "./featurettes/${basename%-featurette.mkv}.mkv"
done
' _ {} +

您可以使用 Bash 的 shell 參數擴展功能來獲取文件名的部分,例如:

$> filename=name-featurette.mkv
$> echo ${filename%-*} #To print first part before '-'
name
$> echo ${filename##*.} #To get the extension
mkv
$> echo ${filename#*-} #To print the part after '-' with extension
featurette.mkv

有了這個並稍微修改你的 find 命令,你應該能夠移動+重命名你的文件:

find . -type f -name '*-featurette.mkv' -maxdepth 2 -execdir sh -c 'f="{}"; mv -- "$f" ./featurettes/"${f%-*}.mkv"' \;

事實上,您應該能夠將 find 命令合二為一來創建目錄、移動和重命名文件。

find . -type f -name '*-featurette.mkv' -maxdepth 2 -execdir sh -c 'f="{}"; mkdir ./featurettes; mv -- "$f" ./featurettes/"${f%-*}.mkv"' \;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM