特定のディレクトリで使用すると、その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
場所に追加します。zsh
tee