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