Windows cmd
の基本的な違いの 1 つ POSIX shells は、ワイルドカード展開の責任者です。シェルは、要求された実際のコマンドを開始する前に、必要なすべての展開を行います。 cmd
ほとんど ワイルドカード パターンを変更せずにコマンドに渡します。 (例外があり、環境変数はほとんどの状況で展開されると思うので、ほとんどと言います。) これにより rename
cmd
と同じ構文で動作します 非常にトリッキーです。
しかし、rename
があります Linux の場合 - 完全に異なる引数を使用して、man ページを確認してください (私のシステムでは少し簡潔で、rename
util-linux
から来ています 私のシステムのパッケージであり、広く利用できるはずです)。最初の名前変更は次のように行われます:
rename .txt .bak *.txt
シェルは *
を実行することに注意してください 展開なので 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
ワイルドカードに関して留意すべきことの 1 つは、ワイルドカードがシェルによって展開されることです。アプリケーションは、ワイルドカードを使用したか、名前を入力したかを認識しません。たとえば、rename *.txt *.bak
と入力すると 、次に rename
コマンドは rename file1.txt file2.txt existingfile.bak
のようなものを見ます .続けるには十分な情報ではありません。
ls
についての質問に対処します まず、簡単だからです。一致する名前だけが必要な場合は、ls
は必要ありません 、シェルが既に展開を行っているためです。
echo t*
ファイルに関する詳細情報が必要な場合は、-d
を渡します ls
へのオプション 、ディレクトリの内容をリストしないように指示します。
ls -ld t*
最初の UNIX システムには標準ユーティリティが付属していなかったため、ファイル名を変更するための標準ユーティリティはありません。ファイルの名前を変更する移植可能な方法はループを使用し、少し冗長です:
for x in *.txt; do mv -- "$x" "${x%.txt}.bak"; done
ファイルの名前を変更するための一般的なユーティリティがいくつかありますが、特定の UNIX システムにインストールされることが保証されているものはありませんが、すべて簡単にインストールできます。主なものは次のとおりです。
-
rename
util-linux
から 組込みされていないすべての Linux システムで利用できます (それ以外では利用できません)。 Debian および派生物 (Ubuntu を含む) では、このコマンドはrename.ul
と呼ばれます。 ..txt
が出現しない場合 最終的な拡張子以外に、書くことができますrename .txt .bak *.txt
-
rename
Debian および派生物が/usr/bin/rename
として出荷される Perl スクリプトです。 .任意の Perl コマンドに従ってファイルの名前を変更できます。rename 's/\.txt\z/\.bak/' *.txt
-
mmv
、いくつかの名前ベースのパターンに従ってファイルの名前変更、コピー、およびリンクを行うことができ、ターゲット名が既に存在する場合にどうなるかに関する多くのオプションがあります。ワイルドカードがシェルによって展開されないようにするには、引用符を使用する必要があることに注意してください。mmv '*.txt' '#1.txt'
-
zmv
シェルが zsh である場合にのみ使用可能な zsh 関数です。任意の zsh パターンに一致させることができます (したがって、ワイルドカードだけでなく、任意の正規表現に従ってファイル名を一致させることができ、日付やサイズなどの他の基準でファイルを一致させることができます)。zmv
コピーしてリンクすることもできます。zmv '(*).txt' '$1.txt'
使用するマシンをある程度制御できる場合は、シェルとして zsh を使用し (bash よりも他の利点があります)、これらの行を ~/.zshrc
に入れることをお勧めします。 :
autoload -U zmv
alias zmv='noglob zmv -w'
alias zcp='zmv -C'
alias zln='zmv -L'
alias zsy='zmv -Ls'
noglob
コマンドの引数でワイルドカードを展開しないようにシェルに指示する zsh 機能です。このように zmv *.txt \$1.txt
と書くことができます (常に $
を保護する必要があります 代替テキストで)