削除を続けます。 [Re:Linuxのコマンドラインで「不良」ファイルを操作する]

ご存知のように、GNU / Linuxの世界は多様です。 同じタスクには多くの解決策があります。



時々、1つのLinuxoidが問題を解決し、2番目のLinuxoidがこのプロセスを見て、介入し、独自の方法でやりたいという抑えられない欲求を感じます。 このような状況で、この記録が生まれました。



間違った名前のファイルを削除するトピックに触れたトピックはこちらです。 次に、同じ問題を解決する他の方法を示します。



ファイルマネージャなしで使用できるのはコマンドラインのみであると想定されています。 「正しい」ファイルとは、number.txt型の名前を持つファイルを意味し、「間違っている」とは他のすべてのファイルを意味します。



インタラクティブ削除



この方法は、ディレクトリ内のファイルの数が少ない場合(またはワイルドカードを使用してそれらのサブセットを選択できる場合)に削除する必要があるファイルがある場合に非常に便利です。

rmコマンドには-iオプションがあり、ファイルを削除する確認をユーザーに求めます。



$ ls -lAh -rw-r--r-- 1 user user 0 May 15 01:47 ? -rw-r--r-- 1 user user 0 May 15 01:47 ? -rw-r--r-- 1 user user 0 May 15 01:47 ? -rw-r--r-- 1 user user 0 May 15 01:48 1.txt -rw-r--r-- 1 user user 0 May 15 01:48 ?.txt $ rm -i * rm: remove regular empty file `\n'? y rm: remove regular empty file `\v'? y rm: remove regular empty file `\f'? y rm: remove regular empty file `1.txt'? n rm: remove regular empty file `\r.txt'? y $ ls -lAh -rw-r--r-- 1 user user 0 May 15 01:48 1.txt
      
      





早くて簡単。



ワイルドカードの拒否



正しい名前の100個のファイルと間違った100個のファイルを作成して、タスクを複雑にします。

 $ touch {1..100}$'\x0a'.txt $ touch {1..100}.txt $ ls -A ? 15?.txt 22?.txt 2?.txt 37?.txt 44?.txt 51?.txt 59?.txt 66?.txt 73?.txt 80?.txt 88?.txt 95?.txt ? 16.txt 23.txt 30.txt 38.txt 45.txt 52.txt 5.txt 67.txt 74.txt 81.txt 89.txt 96.txt ? 16?.txt 23?.txt 30?.txt 38?.txt 45?.txt 52?.txt 5?.txt 67?.txt 74?.txt 81?.txt 89?.txt 96?.txt 100.txt 17.txt 24.txt 31.txt 39.txt 46.txt 53.txt 60.txt 68.txt 75.txt 82.txt 8.txt 97.txt 100?.txt 17?.txt 24?.txt 31?.txt 39?.txt 46?.txt 53?.txt 60?.txt 68?.txt 75?.txt 82?.txt 8?.txt 97?.txt 10.txt 18.txt 25.txt 32.txt 3.txt 47.txt 54.txt 61.txt 69.txt 76.txt 83.txt 90.txt 98.txt 10?.txt 18?.txt 25?.txt 32?.txt 3?.txt 47?.txt 54?.txt 61?.txt 69?.txt 76?.txt 83?.txt 90?.txt 98?.txt 11.txt 19.txt 26.txt 33.txt 40.txt 48.txt 55.txt 62.txt 6.txt 77.txt 84.txt 91.txt 99.txt 11?.txt 19?.txt 26?.txt 33?.txt 40?.txt 48?.txt 55?.txt 62?.txt 6?.txt 77?.txt 84?.txt 91?.txt 99?.txt 12.txt 1.txt 27.txt 34.txt 41.txt 49.txt 56.txt 63.txt 70.txt 78.txt 85.txt 92.txt 9.txt 12?.txt 1?.txt 27?.txt 34?.txt 41?.txt 49?.txt 56?.txt 63?.txt 70?.txt 78?.txt 85?.txt 92?.txt 9?.txt 13.txt 20.txt 28.txt 35.txt 42.txt 4.txt 57.txt 64.txt 71.txt 79.txt 86.txt 93.txt ?.txt 13?.txt 20?.txt 28?.txt 35?.txt 42?.txt 4?.txt 57?.txt 64?.txt 71?.txt 79?.txt 86?.txt 93?.txt 14.txt 21.txt 29.txt 36.txt 43.txt 50.txt 58.txt 65.txt 72.txt 7.txt 87.txt 94.txt 14?.txt 21?.txt 29?.txt 36?.txt 43?.txt 50?.txt 58?.txt 65?.txt 72?.txt 7?.txt 87?.txt 94?.txt 15.txt 22.txt 2.txt 37.txt 44.txt 51.txt 59.txt 66.txt 73.txt 80.txt 88.txt 95.txt
      
      





このケースは少し難解ですが、新しい方法を示すことができます。 否定ワイルドカードを使用して、number.txtの形式のファイルが必要であると仮定して、削除するものを選択します。

 $ ls *[!0-9].txt 100?.txt 17?.txt 24?.txt 31?.txt 39?.txt 46?.txt 53?.txt 60?.txt 68?.txt 75?.txt 82?.txt 8?.txt 97?.txt 10?.txt 18?.txt 25?.txt 32?.txt 3?.txt 47?.txt 54?.txt 61?.txt 69?.txt 76?.txt 83?.txt 90?.txt 98?.txt 11?.txt 19?.txt 26?.txt 33?.txt 40?.txt 48?.txt 55?.txt 62?.txt 6?.txt 77?.txt 84?.txt 91?.txt 99?.txt 12?.txt 1?.txt 27?.txt 34?.txt 41?.txt 49?.txt 56?.txt 63?.txt 70?.txt 78?.txt 85?.txt 92?.txt 9?.txt 13?.txt 20?.txt 28?.txt 35?.txt 42?.txt 4?.txt 57?.txt 64?.txt 71?.txt 79?.txt 86?.txt 93?.txt ?.txt 14?.txt 21?.txt 29?.txt 36?.txt 43?.txt 50?.txt 58?.txt 65?.txt 72?.txt 7?.txt 87?.txt 94?.txt 15?.txt 22?.txt 2?.txt 37?.txt 44?.txt 51?.txt 59?.txt 66?.txt 73?.txt 80?.txt 88?.txt 95?.txt 16?.txt 23?.txt 30?.txt 38?.txt 45?.txt 52?.txt 5?.txt 67?.txt 74?.txt 81?.txt 89?.txt 96?.txt
      
      





すべてが正常であることを確認した後、これらのファイルを削除します。

 $ rm *[!0-9].txt
      
      





見つける



気配りのある読者は、おそらく前の例で3つの無効なファイルを見逃していることに気づいたでしょう。 修正されます。

ディレクトリには、number.txtという形式の100個のファイルと、奇妙な名前の3つのファイルが含まれています。



不要なファイルを選択する方法の1つは、xargs(パイプを介してユーティリティをリンクするためのひげを生やした * nix管理者の古き良きカスタム)



 $ find . -type f -not -name '*txt' ./? ./? ./? $ find . -type f -not -name '*.txt' | xargs rm rm: cannot remove `./': Is a directory
      
      





うーん、ファイルの1つが迷惑であることが判明しました。



 % ls -A ? 15.txt 21.txt 28.txt 34.txt 40.txt 47.txt 53.txt 5.txt 66.txt 72.txt 79.txt 85.txt 91.txt 98.txt 100.txt 16.txt 22.txt 29.txt 35.txt 41.txt 48.txt 54.txt 60.txt 67.txt 73.txt 7.txt 86.txt 92.txt 99.txt 10.txt 17.txt 23.txt 2.txt 36.txt 42.txt 49.txt 55.txt 61.txt 68.txt 74.txt 80.txt 87.txt 93.txt 9.txt 11.txt 18.txt 24.txt 30.txt 37.txt 43.txt 4.txt 56.txt 62.txt 69.txt 75.txt 81.txt 88.txt 94.txt 12.txt 19.txt 25.txt 31.txt 38.txt 44.txt 50.txt 57.txt 63.txt 6.txt 76.txt 82.txt 89.txt 95.txt 13.txt 1.txt 26.txt 32.txt 39.txt 45.txt 51.txt 58.txt 64.txt 70.txt 77.txt 83.txt 8.txt 96.txt 14.txt 20.txt 27.txt 33.txt 3.txt 46.txt 52.txt 59.txt 65.txt 71.txt 78.txt 84.txt 90.txt 97.txt
      
      





見てのとおり、彼だけが一人です。



extglob



Bashには多くのオプションがあります。 extglob-パターンとの比較の高度な機能の使用(パターンマッチング)に興味があります。

 $ shopt extglob extglob off $ shopt -s extglob $ shopt extglob extglob on
      
      





このオプションを有効にすると、ユーザーは(特に)「否定ワイルドカード」を使用できるようになり、サンプルのリストに完全に基づいて動作します。

 $ ls !(*.txt) ? $ rm !(*.txt) $ ls * | wc 100 100 692
      
      





正しいファイルが100個残っています、成功です!

extglobが不要になった場合は無効にします。

 $ shopt -u extglob
      
      





ご清聴ありがとうございました。



使用した材料:

男rm

男バッシュ

男を見つける



All Articles