Linux

如何在 ls 和 mv 中使用 ms-dos 樣式的萬用字元?

  • March 14, 2016

我不幸來自 MS-DOS 的背景——但至少它讓我體會到 Linux 的強大程度。我一直在努力讓我的 Linux-Fu 達到標準,但是有幾件事可以用 DOS 完成,我不確定如何用 Linux最容易地完成:

重命名多個文件 - 使用兩個萬用字元

c:\> dir

Directory of c:\
   file1.txt
   file2.txt
   file3.txt
   file4.txt

c:\>rename *.txt *.bak

c:\> dir

Directory of c:\
   file1.bak
   file2.bak
   file3.bak
   file4.bak

我知道我可以find -exec在這裡使用,但可以使用更短的語法 - 也許mv使用一些特殊的標誌或語法?我想關鍵是第二個 *萬用字元,因為linux不應該對第一個有問題(即我知道如何選擇我想使用萬用字元重命名的文件)

重命名單個文件 - 使用一個萬用字元

c:\> dir

Directory of c:\
   file1.txt

c:\>rename file1.txt *.bak

c:\> dir

Directory of c:\
   file1.bak

這在重命名長而笨重的文件名時特別有用。我想也許我可以用它mv file1.txt $1.bak來結束,file1.txt.bak這也是可以接受的,但我不確定你是否可以$1使用 shell 命令引用參數內聯。同樣,在這種特殊情況下,ms-dos 如何對*萬用字元進行混雜以用作文件名部分的擷取/替換匹配,這很方便。

使用萬用字元過濾目錄列表

c:\> dir

Directory of c:\
   file1.txt
   file2.txt
   file3.txt
   file4.txt
   text.txt
   \temp       (directory) 

c:\> dir file*

Directory of c:\
   file1.txt
   file2.txt
   file3.txt
   file4.txt

c:\> t*

Directory of c:\
   text.txt
   \temp       (directory) 

我不確定這樣做的正確語法是什麼ls,或者是否可能。如果我做了類似的ls t*事情,它將遞歸到以t. 我的解決方法要麼一直在使用find . --max-depth 1 -iname "t*",要麼類似ls -al | grep t——它們都不像現在這樣簡短dir t*

最後,我知道我可以設置別名來縮短這些長命令,但我想學習一些開箱即用的 linux-fu 來做這些事情,因為有時你連接到遠端系統或工作在新機器上。

那麼我怎樣才能像以前那樣mvls文件一樣dirrename文件呢?

Windows 和 POSIX shell 之間的根本區別之一cmd是由誰負責萬用字元擴展。在啟動您要求的實際命令之前,Shell 會執行所有所需的擴展。cmd 主要將萬用字元模式傳遞給未修改的命令。(我說的主要是,因為我認為存在異常,並且在大多數情況下都會擴展環境變數。)這使得編寫 arename可以使用與 in 相同的語法cmd非常棘手。

但是有一個rename用於 Linux 的 - 具有完全不同的參數,請查看手冊頁(在我的系統上有點簡潔,並且rename來自util-linux我係統上的包,應該可以廣泛使用)。您的第一次重命名將像這樣完成:

rename .txt .bak *.txt

請注意,shell 進行了*擴展,因此rename它自己實際上認為它是這樣呼叫的:

rename .txt .bak file1.txt file2.txt file3.txt ...

所以你可以猜出單個文件的版本:

rename .txt .bak file1.txt

如果您不想使用rename但自己實現它,您可以為此創建一個函式。假設您只想更改文件副檔名,並且對於單個文件重命名,請查看以下內容:

$ function chext() {
 newext="$1"
 file="$2"
 newfile="${file%.*}$newext"
 echo mv "$file" "$newfile"
}
$ chext .csv test.txt
mv text.txt text.csv

$newfile是使用子字元串刪除建構的,以去除原始副檔名,然後連接新副檔名。您可以擴展該功能以相對輕鬆地處理多個文件。


至於您的ls問題,請使用-d開關。這將阻止ls列出目錄的內容。

展示:

$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:29 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.csv
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

萬用字元重命名

$ rename .csv .txt f*
$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:34 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.txt
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

單文件重命名

$ rename .txt .csv f1.txt 
$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:34 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.txt
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

預設ls

$ ls -l t*
-rw-r--r-- 1 owner users    0 Jan  7 17:27 test.csv

test:
total 0
-rw-r--r-- 1 owner users 0 Jan  7 17:33 dont_show_me_please

ls不檢查目錄

$ ls -ld t*
drwxr-xr-x 2 owner users 4096 Jan  7 17:33 test
-rw-r--r-- 1 owner users    0 Jan  7 17:27 test.csv

引用自:https://unix.stackexchange.com/questions/28537