私は残念ながらMS-DOSの経験がありますが、少なくともLinuxがどれほど強力であるかを味わいました。私はLinux-Fuを同等のレベルに引き上げようとしましたが、DOSでできることはいくつかありますが、どうすればよいかわかりません。最も簡単Linuxの場合:
複数のファイル名を変更する - 2つのワイルドカードを使用する
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
また、この特別なケースでは、*
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
ベストアンサー1
WindowsシェルとPOSIXシェルの基本的な違いの1つcmd
は、ワイルドカード拡張を担当する人が誰であるかです。シェルは、要求された実際のコマンドを実行する前に必要な拡張を実行します。cmd
最大ワイルドカードパターンを変更せずにコマンドに渡します。 (例外があると考え、ほとんどの場合、環境変数が拡張されると思うので、最もよく言います。) これにより、rename
と同じ構文で動作するプログラムを作成しますcmd
。
ただし、Linux用もありますrename
。まったく異なるパラメータを使用するマニュアルページを確認してください(私のシステムでは少し簡潔で、広く使用する必要がある私のシステムのパッケージに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