3

試験の復習をしているのですが、質問の 1 つで、特定のディレクトリ内にある 6 文字以上の長さのファイルを削除するコマンドを 1 つ書くよう求められています。

例:

person@ubuntumachine:~$ ls

abc.txt, abcdef.txt, 123456.txt, helloworld.txt, rawr.txt

このコマンドは、ファイル「abcdef.txt」、「12346.txt」、および「helloworld.txt」を削除します。

ある時点で * が使用されることは承知していますが、6 文字の長さを示すために何を使用すればよいかわかりません...

ありがとうございました<3

4

3 に答える 3

18

質問には 2 つの解釈があるため、両方の回答が与えられます。

1. ファイル名が 6 文字以上のファイルを削除するには:

rm ??????*

説明:

  • ??????:?はそのまま入力します。それぞれ?が任意の 1 文字に一致します。つまり、ここでは「任意の 6 文字に一致する」という意味です。
  • *:*ワイルドカードは 0 個以上の文字に一致します
  • したがって、6 文字以上のファイルはすべて削除されます。

または:

find -type f -name "??????*" -delete

説明:

  • find: 検索コマンドを呼び出します
  • -type f: ファイルのみを検索します。
  • -name "??????*": 上記と同じ考え方で、6 文字以上の任意のファイルに一致します。
  • -delete: 見つかったそのようなファイルを削除します。

2. CONTENTS に 6 文字以上のファイルを削除するには:

find -type f -size +5c -delete

説明:

  • find: 検索コマンドを呼び出します
  • -type f: ファイルのみを検索します (ディレクトリなどは検索しません)
  • -size +5c: 5 文字を超えるファイルのみを検索します。注:EOFこの場合、(ファイルの終わり) は文字としてカウントされることを思い出してください。カウンターから除外する場合はEOF、5 から 6 に変更します。
  • -delete: 見つかったそのようなファイルを削除します
于 2012-11-16T02:27:57.767 に答える
2

このようなものが動作するはずです:

$ ls|while read filename; do test ${#filename} -gt 6 && echo rm "$filename"; done

トリックは、${#foo}構文を使用してファイル名の長さを取得することです。

出力に満足したら、すぐに前のコマンドの後に次を実行します。

$ !! | sh

これは最後のコマンド (ファイルを削除するための rm コマンドを示しています) を繰り返し、それを sh にパイプして実際に実行します。

于 2012-11-16T02:27:49.797 に答える
0

これにより、現在のディレクトリとすべてのサブディレクトリで要求されたロジックが実行されます。

find . -type f -regextype posix-egrep -regex ".*/[^/]{5}[^/]+$" -exec rm -vf {} \;

  • find .
    • ローカル ディレクトリを検索します (他の場所を検索するには . を変更します)
  • -type f
    • ファイルのみを考慮
  • -regextype posix-egrep
    • egrep 正規表現構文を使用します (これは私が知っていることです)
  • -regex ".*/[^/]{5}[^/]+$"
    • find は、この正規表現に一致するすべてのパスに一致します
    • 正規表現は次のように分解されます。
      • .*/ファイル名までのパスを効果的に無視します
      • [^/]{5}スラッシュではない 5 文字を検索します
      • [^/]+$ 行末 ($) の前に、スラッシュ以外の文字が少なくとも 1 文字 (つまり 6 文字以上) 必要です。
  • -exec rm -vf {} \;
    • {}find は、検索クエリが一致する各ファイル (この場合、正規表現に一致するパスを持つファイル)に置き換えます。したがって、これは削除を達成します。 -vf結果を印刷するために追加されたので、何が起こったのかがわかります。
      • -execは構文にうるさいです -単純なものがその場所で使用された場合に遭遇しない\;ようにするために必要です。find: missing argument to '-exec';
      • -printの代わりに使用する-exec rm -vf {} \;か、単に削除することでこれをテストできます-exec rm -vf {} \;(-printは find のデフォルトの動作です)
于 2012-11-16T03:10:01.897 に答える