サブディレクトリのファイルをcsvファイルに書き込み、Linuxコマンドラインの親ディレクトリに保存します。

サブディレクトリのファイルをcsvファイルに書き込み、Linuxコマンドラインの親ディレクトリに保存します。

"subdir"というサブディレクトリを持つ"dir"というディレクトリがあります。サブディレクトリには多くのファイルがあります。これらのファイルのリストをCSVファイルに作成し、Linuxのコマンドラインを使用して "dir"ディレクトリに保存したいと思います。私のコードはcsvファイルを生成しますが、ディレクトリの代わりにサブディレクトリに保存します。私は何が間違っていましたか?私はdirディレクトリにいます。

dir$ ls subdir >names.csv

ベストアンサー1

より簡単な選択肢として、サブディレクトリとしてcdして使用することができます。

printf "%s\n" * >../list.csv

これにより、カンマなしで改行で区切られ、改行で終わるリストが提供されます。列が1つしかない縮退csvファイルであると考えることができます。

隠しファイル(名前がドットで始まるファイル)を含めるには、* .*一意の代わりに*。と..ディレクトリ名を* .[^.]* ..?*使用してください。銃:

printf "%s\n" *             >../list.csv   # For non-hidden files.
printf "%s\n" * .*          >../list.csv   # For all files.
printf "%s\n" * .[^.]* ..?* >../list.csv   # For all files but `.` and `..`.

ただし、Linuxのファイル名自体に改行文字を含めることができることに注意してください。実際、ファイル名の唯一のシングルバイト区切り文字はヌルバイトです。


次のため更新されましたこのコメント:

共通の親ディレクトリにある別のファイルに分類したい隠しコンテンツを持たないサブディレクトリが複数あるとします。 (すべての名前を1つのファイルに収集する方がはるかに短いです。このエレガントなソリューション。そして正直言って、私はあなたのコメントを十分に注意深く読んでいません。 )これは対応する親ディレクトリ(あなたの場合はdir)で達成できます。

find . -mindepth 1 -maxdepth 1 -type d -exec bash -c 'cd {}; printf "%s\n" * >../$(basename {}).csv' \;

これには手順が必要ですfindbashbasename

自動的に作成されたcsvリストと競合する名前のファイルがディレクトリに含まれていないことを使用するときは注意が必要です。

次のように動作します。現在のディレクトリ()より1つのディレクトリレベル以下のすべてのファイルをfind考慮します。これがまさにそのことです。ディレクトリ()の場合は、空の中括弧()とコマンドの間の末尾の文字()を次のように置き換えて実行します。ディレクトリの名前。この名前を次のように表現すると、.-mindepth 1 -maxdepth 1-type d-exec-exec\;{}<SUBDIR>

bash -c 'cd <SUBDIR>; printf "%s\n" * >../$(basename <SUBDIR>).csv'

これは子プロセスから始まり、オプション引数をシェルスクリプトとして実行させますbash-c

cd <SUBDIR>;
printf "%s\n" * >../$(basename <SUBDIR>).csv

これは上記とほぼ同じです。ここでの表現は

$(basename <SUBDIR>)

に拡張されるデフォルト名です<SUBDIR><SUBDIR>あなたの場合、./subdir1、./subdir2などが繰り返されるので、これは必要です。対応するデフォルト名は subdir1、subdir2 などです。

おすすめ記事