如何在 ls 和 mv 中使用 ms-dos 樣式的萬用字元?
我不幸來自 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 來做這些事情,因為有時你連接到遠端系統或工作在新機器上。
那麼我怎樣才能像以前那樣
mv
和ls
文件一樣dir
和rename
文件呢?
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