簡體   English   中英

在單個命令中使用前綴重命名文件夾中的所有文件

[英]Rename all files in a folder with a prefix in a single command

重命名文件夾中的所有文件,前綴為"Unix_"

假設一個文件夾有兩個文件

a.txt
b.pdf

那么它們都應該從一個命令重命名為

Unix_a.txt
Unix_b.pdf

如果您的文件名不包含空格並且您沒有任何子目錄,則可以使用簡單for循環:

$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done 

否則使用方便的rename命令(這是一個 perl 腳本) - 盡管它可能不是在每個 Unix 上都可用(例如 OS X 不帶有rename )。

debian-administration.org 上的簡短概述:

如果您的文件名包含空格,則更容易使用find ,在 Linux 上,以下內容應該有效:

$ find . -type f -name '*' -printf "echo mv '%h/%f' '%h/Unix_%f\n'" | sh

不幸的是,在 BSD 系統上,沒有-printf選項。 但是GNU findutils應該是可安裝的(例如在 Mac OS X 上使用brew install findutils )。

$ gfind . -type f -name '*' -printf "mv \"%h/%f\" \"%h/Unix_%f\"\n" | sh

在包含文件的文件夾中嘗試rename命令:

rename 's/^/Unix_/' *

rename 參數( sed s 命令)表示將正則表達式^替換為Unix_ 插入符號 (^) 是一個特殊字符,表示行首

我認為這正是您正在尋找的:

ls | xargs -I {} mv {} Unix_{}

是的,它簡單而優雅,功能強大,而且是單行的。 您可以在頁面上從我這里獲得更詳細的介紹: 重命名文件和目錄(添加前綴)

我最近遇到了同樣的情況,並找到了一個更簡單的內置解決方案。 我在這里分享它,以便它可以幫助其他人尋找解決方案。

在 OS X Yosemite 中,Apple 已將批量重命名功能直接集成到 Finder 中。 詳細信息可在此處獲得。 我也復制了以下步驟,

重命名多個項目

  1. Select 項目,然后按住 Control 鍵單擊其中一項。

  2. 在快捷菜單中, select 重命名項目。

  3. 在“重命名文件夾項目”下方的彈出菜單中,選擇替換名稱中的文本、向名稱中添加文本或更改名稱格式。

    • 替換文本:在“查找”欄中輸入要刪除的文本,然后在“替換為”欄中輸入要添加的文本。

    • 添加文本:在字段中輸入要添加的文本,然后選擇在當前名稱之前或之后添加文本。

    • 格式:選擇文件的名稱格式,然后選擇將索引、計數器或日期放在名稱之前或之后。 在“自定義格式”字段中輸入名稱,然后輸入要開始的數字。

  4. 單擊重命名。

如果您的文件中有一個通用模式,則可以使用替換文本,否則添加文本也可以完成這項工作。

您可以只使用-i而不是-I {}

ls | xargs -i mv {} unix_{}

這也很完美。

  • ls - 列出目錄中的所有文件
  • xargs - 由於-i選項,逐行接受所有文件
  • {}是所有文件的占位符,如果xargs獲得兩個以上的 arguments 作為輸入,則必須這樣做

使用 awk:

ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh

也適用於帶有空格的項目並忽略目錄

for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done

使用rnm (您需要安裝它):

rnm -ns 'Unix_/fn/' *

或者

rnm -rs '/^/Unix_/' *

PS:我是這個工具的作者。

情況:

我們在/user/ssl/中有certificate.key certificate.crt

我們想將任何以certificate開頭的內容重命名為certificate_OLD

我們現在位於/user

首先,您使用-n進行試運行:

rename -n "s/certificate/certificate_old/"./ssl/*

返回:

rename(./ssl/certificate.crt, ./ssl/certificate_OLD.crt) rename(./ssl/certificate.key, ./ssl/certificate_OLD.key)

您的文件將保持不變,這只是一個測試運行。

解決方案:

當您對測試結果感到滿意時,請真正運行它:

rename "s/certificate/certificate_OLD/"./ssl/*

這是什么意思:

`重命名“s/SOMETHING/SOMETHING_ELSE”路徑/文件

小費:

如果您已經在路徑上,請像這樣運行它:

rename "s/certificate/certificate_OLD/" *

或者,如果您想在任何以ss開頭的子目錄中執行此操作,請執行以下操作:

rename -n "s/certificat/certificate_old/"./ss*/*

你也可以這樣做:

rename -n "s/certi*/certificate_old/"./ss*/*

這會重命名以ss開頭的任何子目錄中以certi開頭的任何內容。

天空才是極限。

使用正則表達式並始終在使用-n之前對其進行測試。

注意這甚至會重命名匹配的文件夾名稱。 最好cd進入目錄並在那里執行。 使用風險自負。

find -execdir rename

這將使用僅影響基本名稱的正則表達式重命名文件和目錄。

所以對於一個前綴,你可以這樣做:

PATH=/usr/bin find . -depth -execdir rename 's/^/Unix_/' '{}' \;

或僅影響文件:

PATH=/usr/bin find . -type f -execdir rename 's/^/Unix_/' '{}' \;

-execdir首先cd進入目錄,然后僅在基本名稱上執行。

我在以下位置進行了更詳細的解釋: 在 Linux 中查找多個文件並重命名它們

暫無
暫無

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

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