1つを除くすべてのファイルを移動するにはどうすればよいですか?私は次のようなものを探しています:
'mv ~/Linux/Old/!Tux.png ~/Linux/New/'
古いものを新しいものに移動します-を除くフォルダTux.png
。!-記号は否定を表します。その仕事のための道具はありますか?
bash を使用し、extglob
シェル オプションを設定している場合 (通常はこれが当てはまります):
mv ~/Linux/Old/!(Tux.png) ~/Linux/New/
以下を .bashrc に追加します
shopt -s extglob
正規表現を拡張します。その後、1 つを除くすべてのファイルを次の方法で移動できます。
mv !(fileOne) ~/path/newFolder
ディレクトリのコピーでは、スレッドWhy extglob except breakexcept condition?で通知されているように、名前に forward-flash を使用できないことに注意してください。:
cp -r !(Backups.backupdb) /home/masi/Documents/
ここでは否定の前に間違ってBackups.backupdb/
います。他のコマンドや他の例外でグロブを誤って使用するリスクがあるため、ディレクトリの移動にも使用しません。
従来の find & xargs の方法を使用します。
find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png -print0 |
xargs -0 mv -t ~/Linux/New
-maxdepth 1
再帰的に検索しないようにします。ファイルだけに関心がある場合は、-type f
. パス自体を結果に-mindepth 1
含めないようにします。~/Linux/Old
埋め込まれた改行を含むものを含む、任意のファイル名で動作します。
1 つのコメントは、 mv-t
オプションがおそらく GNU 拡張であることに注意しています。それを持っていないシステムの場合
find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png \
-exec mv '{}' ~/Linux/New \;
簡単な方法は、移動コマンドが一致しないように tux ファイル名を変更することです。
例えば:
mv Tux.png .Tux.png
mv * ~/somefolder
mv .Tux.png Tux.png
これは、特定のファイルまたはディレクトリを除外する単純な移動については、少し安全で信頼しやすいと思います。
ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET
次の方法は 100% 保証されているわけではなく、スクリプト作成には使用しないでください。しかし、インタラクティブなシェルをすばやく使用するのに十分な場合もあります。次のようなファイル ファイル グロブ
[abc]*
(a、b、または c で始まる名前を持つすべてのファイルに一致します) 最初に「^」文字を挿入することで否定できます。
[^abc]*
たとえば、次のように、「lost+found」ディレクトリと一致しないためにこれを使用することがあります。
mv /mnt/usbdisk/[^l]* /home/user/stuff/.
もちろん、l で始まる他のファイルがある場合は、後でそれらを処理する必要があります。
mv `find Linux/Old '!' -type d | fgrep -v Tux.png` Linux/New
find コマンドはすべての通常のファイルを一覧表示し、fgrep コマンドは Tux.png を除外します。バッククォートは mv に、結果のファイル リストを移動するように指示します。