GNU/Linux >> Linux の 問題 >  >> Linux

ls と mv で ms-dos スタイルのワイルドカードを使用するにはどうすればよいですか?

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 と書くことができます (常に $ を保護する必要があります 代替テキストで)


Linux
  1. Linuxでユーザーとグループを操作する方法

  2. ヒアドキュメントと猫と組み合わせて出力リダイレクトを使用する方法は?

  3. 例を使用して Linux のシャットダウンおよび再起動コマンドを使用する方法

  1. xargs でエイリアス化されたコマンドを使用するにはどうすればよいですか?

  2. LinuxでPythonでアラートダイアログを使用するにはどうすればよいですか?

  3. xargs-command でワイルドカードを使用するには?

  1. Linuxでの例で「cat」および「tac」コマンドを使用する方法

  2. 攻撃者は Bluetooth で何ができ、どのように軽減する必要がありますか?

  3. FAT ファイル システムで rsync を使用するにはどうすればよいですか?