
'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」というファイルが作成されていることがわかります。