Midnight Commanderなどのファイルマネージャを使用するのは良い機会かもしれませんが、シェルでこれを行うためのエレガントな方法があるかどうかを知りたいです。
あるディレクトリから別のディレクトリにファイルをコピーしたいとしましょう。ディレクトリは大きく、ファイル名は長くて複雑で、部分的には秘密です。正確な名前はわかりませんがpenguin
。
初めて検索
find . -iname "*penguin*" | less
結果を見てみましょう。
./l1fe_of_Penguins ./Fw0rld_Of_penguins ./FUnNy_penguin
「Funny Penguin」ファイルをコピーしたいです。その後、複雑なファイル名のいくつかの関連部分を覚えていて、それをシェルコマンドに入力しました。
cp FUn*penguin /media/share
どうすればより速くできますか?フルテキストモードで検索結果のコマンドライン引数でファイル名を取得するには?
答え1
Tabキーを使用して、ほとんどのシェルのファイルシステムパスを自動補完できます。
bashはこれとそれ以上をサポートします。
しかし、私が遭遇した最もインタラクティブなシェルはzshですが、ここにはカスタム設定ファイルがあります。grmlのzsh設定そしてああ、。
zshを使用すると、自動補完のためにglobを使用でき、一度に複数のファイルを完成させることもできます。
どのタイプのUnixやLinuxを使用しているのかわからない場合でも、私が言うことができる最善の方法は、ソフトウェアリポジトリを確認するか、直接zshをコンパイルすることです。
Penguinについて言及したので、Linuxを使用しているとし、パッケージマネージャに次のことを確認してください。
zsh
高度なrcファイルの場合、シェルは多くの素晴らしい機能をサポートできます。
grml-zsh-config
oh-my-zsh
答え2
私はこれを行う方法を見つけました:
find . -iname "*penguin*" | pick | xargs -J % cp -i % /media/share
答え3
-exec
オプションを使用すると、find
次のコマンドを実行することもできます。
find . -iname "*penguin*" -exec cp {} /media/share \;
これは{}
名前に置き換えられます。
ところで。man find
すごい! :)
答え4
これを試してみてください。
出力に満足したら、echoコマンドを削除してください。
find . -iname "*penguin*" | awk '/penguin$/' | while read filename
do
echo "cp ${filename} /media/share"
done