特定の名前の先頭に文字列を追加して、ファイルにディレクトリファイル名を書き込みます。

特定の名前の先頭に文字列を追加して、ファイルにディレクトリファイル名を書き込みます。

特定のディレクトリで使用すると、そのls | tee -a file.txt ディレクトリのリストが提供されます。

例:

file1.txt  file2.txt  file3.txt

ls一括後処理のためにコマンドの特定の文字列を最終出力に追加するにはどうすればよいですか?各ファイルに対して、特定のファイル名と特定のコマンドをコピーして貼り付ける必要があります。

例は次のとおりです。

ls | tee -a string1(FilenameFromDirectory)string2

出力

string1(file1.txt)string2
string1(file2.txt)string2
string1(file3.txt)string2

答え1

始めと終わりに文字列を追加するのはとても簡単です。

$ ls
file1.txt  file2.txt  file3.txt
$ ls | sed -e 's/^/string1/' -e 's/$/string2/'
string1file1.txtstring2
string1file2.txtstring2
string1file3.txtstring2

括弧を使用しないことをお勧めします( )。ファイル名に特殊文字が含まれると、処理がより複雑になります。可能であれば、_代わりにまたはを使用してください。-括弧の使用に固執する場合は、次のようにできます。

$ ls | sed -e 's/^/string1(/' -e 's/$/)string2/'
string1(file1.txt)string2
string1(file2.txt)string2
string1(file3.txt)string2

重要:端末から結果を印刷したり、以前と同じようにファイルに転送したい場合は>問題ありません。teeただし、これを使用してファイルの名前を変更したり、ファイルをコピーまたは操作したい場合は機能しません。分析するlsこのアプローチは非常に脆弱であり、わずかに奇妙なファイル名がクラッシュする可能性があります。より安全なアプローチは次のとおりです。

$ for file in *; do
   printf 'string1(%s)string2\n' "$file"
done
string1(file1.txt)string2
string1(file2.txt)string2
string1(file3.txt)string2

答え2

printf 'string1(%s)string2\n' *

現在の作業ディレクトリに隠されていないファイルごとに1行を印刷しstring1(filename)string2、アルファベット順に並べ替えるか、一致するファイルがないとエラーで失敗します。

一致するファイルが存在しないときに何も印刷しない場合は、エラーを報告する代わりにN(nullglob)glob修飾子を使用してファイル数を確認して実行できます。

files=( *(N) )
(( $#files == 0 )) || printf 'string1(%s)string2\n' $files

または、匿名関数とrcスタイルの配列拡張を使用してください。

() { print -rC1 'string1('$^files')string2'; } *(N)

ただし、各ファイルに対していくつかのコマンドを実行するには、次のようにします。

for file (*(N)) cmd with $file as argument

これらのコマンド/ループの出力を生のstdoutに送信していくつかのファイルに追加するには、tee -a some-file出力を複数回リダイレクトする場合は、パイプで接続するか、暗黙的な組み込みではない>&1 >> some-file場所に追加します。zshtee

関連情報