
我有一個名為“dir”的目錄,其中有一個名為“subdir”的子目錄。子目錄中有很多檔案。我想將這些文件的清單寫入 CSV 文件,並使用 Linux 上的命令列將其儲存到「dir」目錄中。我的程式碼會建立 csv 文件,但將其保存在子目錄中,而不是目錄中。我哪裡做錯了?我在dir目錄下;
dir$ ls subdir >names.csv
答案1
作為更簡單的替代方案,您可以 cd 到 subdir 並使用
printf "%s\n" * >../list.csv
這將為您提供一個換行符號分隔和換行符終止的列表,不涉及逗號。您可以將其視為只有一列的退化 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 中的檔案名稱本身可能包含換行符。事實上,檔案名稱唯一唯一的單字節分隔符號是空字節。
更新由於這則評論:
讓我們假設您有任意數量的子目錄,您希望將其非隱藏內容編入公共父目錄中的單獨檔案中。 (將所有名稱收集在一個文件中要短得多,請參閱這個優雅的解決方案。而且,說實話,我沒有足夠仔細地閱讀您的評論。
find . -mindepth 1 -maxdepth 1 -type d -exec bash -c 'cd {}; printf "%s\n" * >../$(basename {}).csv' \;
這需要程序find
、bash
和basename
。
使用它時您應該格外小心,該目錄不包含名稱與自動產生的 csv 清單衝突的檔案。
它的工作原理如下:find
考慮位於當前目錄 ( .
) 下一級目錄級別的每個文件——這就是它-mindepth 1 -maxdepth 1
的作用——:如果它是目錄 ( ),則在替換空大括號後-type d
執行 ( )和尾隨-exec
之間的指令( ) 按該目錄的名稱。如果我們用 表示這個名字,結果是-exec
\;
{}
<SUBDIR>
bash -c 'cd <SUBDIR>; printf "%s\n" * >../$(basename <SUBDIR>).csv'
這bash
在子進程中啟動,使其將選項的參數-c
作為 shell 腳本執行,即
cd <SUBDIR>;
printf "%s\n" * >../$(basename <SUBDIR>).csv
這與上面幾乎相同。這裡,表達式
$(basename <SUBDIR>)
擴展為 的基本名稱<SUBDIR>
。這是必要的,因為<SUBDIR>
在您的情況下將迭代 ./subdir1、./subdir2 等。對應的基本名稱是 subdir1、subdir2 等。
答案2
您應該透過使用來實現它為了環形。
如果我的理解是正確的,您想要取得子目錄中的檔案清單。所以做這樣的事情:
$ cd dir
$ for files in subdir/*;do echo $files|cut -d '/' -f 2 >>filelist.csv;done
現在,您可以看到在 dir 目錄下建立了一個名為「filelist.csv」的檔案。