特定のディレクトリ名をファイルにコピーする方法

特定のディレクトリ名をファイルにコピーする方法

そのため、複数のディレクトリがあり、「k」で始まり、「g」で終わるディレクトリ名だけをファイルにコピーしたいと思います。どうすればいいですか?

答え1

そしてzsh

print -rC1 -- k*g(N/) > dirnames.txt

k1g ただし、改行文字はファイル名のすべての文字と同じくらい有効であるため、k2g名前付きの2つのファイルを区別できないことを意味しますk1g<newline>k2g

-Nにオプションを追加するだけですprint

dirs=( ${(0)"$(<dirnames.nul-delimited)"} )その後、次のようにして結果ファイルを後処理できますxargs -r0a dirnames.nul-delimited some-command

tサブディレクトリ (basename/ail) のファイル名も含めるには、k*g次の手順を実行します。

print -rNC1 -- **/k*g(ND/:t) > dirnames.nul-delimited

たとえば、aa/kingとfileの両方が存在する場合、重複がある可能性があります。.git/king以下を使用して重複項目を削除できます。

() { print -rNC1 -- ${(u)argv} > dirnames.nul-delimited; } **/k*g(ND/:t)

人間が読むことができ、後処理可能なファイルのリストを取得する1つの方法は、シェルを使用してファイル名を引用することです。

print -rC1 -- k*g(N/:q) > dirnames.txt

zshここでは特定の引用バリアントが使用されます。または、移植可能で(shに似たシェルで)、より安定した引用構文を使用してください。

() { print -rC1 -- ${(qq)argv} > dirnames.txt; } k*g(N/)

またはGNUを使用してくださいls

ls -Ud --quoting-style=shell-always -- k*g(N/) > dirnames.txt

リストは後で次のように検索できます。

dirs=( ${(Q)${(zZ[n])"$(<dirnames.txt)"}} )

存在するzsh

または両方zshまたはbash(またはdirs最初に配列として宣言した場合はksh93):

eval "dirs=( $(<dirnames.txt) )"

そうしない、zshまたは何らかの理由でそれを行うことはできませんが、GNUシステムを使用し、ファイル名がロケールの有効なテキストで生成された場合は、次のことができます。

  • 1行に1つずつ印刷します(ファイル名に改行文字が含まれていないと仮定)。

    find . -mindepth 1 -maxdepth 1 -name 'k*g' -type d -printf '%f\n' |
      sort > dirnames.txt
    
  • 同じNULで区切られた:

    find . -mindepth 1 -maxdepth 1 -name 'k*g' -type d -printf '%f\0' |
      sort -z > dirnames.txt
    
  • 再帰的、nullで区切られた:

    find . -name 'k*g' -type d -printf '%f\0' |
      sort -z > dirnames.txt
    
  • 同じ重複排除:

    find . -name 'k*g' -type d -printf '%f\0' |
      LC_ALL=C sort -zu |
      sort -z > dirnames.txt
    
  • 引用(バッチごとに並べ替えられたが)

    find . -mindepth 1 -maxdepth 1 -name 'k*g' -type d -printf '%f\0' |
      xargs -r0 ls -d --quoting-style=shell-always --
    
  • 正しい見積もりと注文:

    find . -mindepth 1 -maxdepth 1 -name 'k*g' -type d -printf '%f\0' |
      sort -z |
      LC_ALL=C gawk -v 'RS=\0' -v q="'" '
        shquote(s) {
          gsub(q, q "\\" q q, s)
          return q s q
        }
        {print shquote($0)}' |
      xargs -r0 ls -d --quoting-style=shell-always --
    

答え2

lsので、使用しない方が最善です。これ

努力する:

find * -maxdepth 0 -type d -name 'k*g' > filename.txt

(存在しない-maxdepth 0場合は、そのフォルダのサブフォルダも実行されます。大文字のKとGも一緒に計算する必要がある場合は-iname代わりに使用してください。)-name

ハイフンで始まるフォルダまたはファイルがある場合(誰がそうですか?)、次のものを使用できます。

find . -maxdepth 1 -type d -name 'k*g' | sed 's/^\.\///' > filename.txt

-maxdepth 0スイッチはからに切り替わります-maxdepth 1

答え3

リダイレクトにシェルワイルドカードを使用できます。

$ ls -d k*g/ > filename.txt

ディレクトリ名に改行文字が含まれていると中断されます。 (私考えるファイルは選択せずにディレクトリのみを選択しますが、確認するためにコンピュータの前にあるわけではありません。 )

関連情報