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

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

'dir' というディレクトリがあり、その中に 'subdir' というサブディレクトリがあります。サブディレクトリには多くのファイルがあります。Linux のコマンド ラインを使用して、これらのファイルのリストを CSV ファイルに書き込み、'dir' ディレクトリに保存したいと思います。私のコードは csv ファイルを作成しますが、それを dir ではなく subdir に保存します。どこが間違っているのでしょうか。私は 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 バイト区切り文字は null バイトです。


更新理由このコメント:

隠しファイルではないコンテンツを共通の親ディレクトリ内の別々のファイルにカタログ化したいサブディレクトリがいくつもあると仮定します。(すべての名前を1つのファイルにまとめると、はるかに短くなります。このエレガントな解決策(そして、実を言うと、私はあなたのコメントを十分注意深く読んでいません。)これは、親ディレクトリ(あなたの場合はdir)で次のように実行できます。

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

findこれには、、、bashおよびプログラムが必要ですbasename

これを使用する場合、自動的に生成された csv リストと名前が競合するファイルが dir に含まれないように特に注意する必要があります。

仕組みは次のようになります。現在のディレクトリ ( )findのちょうど 1 ディレクトリ下の各ファイルを考慮します。つまり、次のようになります。ディレクトリ ( ) の場合は、空の括弧 ( ) をそのディレクトリの名前に置き換えた後、 との間にあるコマンドを実行します ( ) 。この名前を で表すと、次のようになります。.-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>)

は のベース名に展開されます。これは、 が ./subdir1、./subdir2 などを反復処理する<SUBDIR>ために必要です。対応するベース名は subdir1、subdir2 などです。<SUBDIR>

答え2

それを達成するには、のためにループ。

私の理解が正しければ、サブディレクトリ内のファイルのリストを取得したいということですね。それでは、次のようにします。

$ cd dir
$ for files in subdir/*;do echo $files|cut -d '/' -f 2 >>filelist.csv;done

これで、 dir ディレクトリの下に「filelist.csv」というファイルが作成されていることがわかります。

関連情報