"subdir"이라는 하위 디렉터리가 있는 "dir"이라는 디렉터리가 있습니다. 하위 디렉터리에 많은 파일이 있습니다. 이러한 파일 목록을 CSV 파일에 작성하고 Linux의 명령줄을 사용하여 "dir" 디렉터리에 저장하고 싶습니다. 내 코드는 csv 파일을 생성하지만 디렉터리 대신 하위 디렉터리에 저장합니다. 내가 뭘 잘못했나요? 나는 dir 디렉토리에 있습니다.
dir$ ls subdir >names.csv
답변1
더 간단한 대안으로 하위 디렉토리로 cd하고 사용할 수 있습니다.
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의 파일 이름 자체에 개행 문자가 포함될 수 있다는 점을 명심하십시오. 실제로 파일 이름에 대한 유일한 단일 바이트 구분 기호는 널 바이트입니다.
다음으로 인해 업데이트됨이 댓글:
공통 상위 디렉토리에 있는 별도의 파일로 분류하려는 숨겨진 콘텐츠가 없는 하위 디렉토리가 여러 개 있다고 가정해 보겠습니다. (모든 이름을 하나의 파일에 수집하는 것이 훨씬 더 짧습니다.이 우아한 솔루션. 그리고 솔직히 말해서 나는 당신의 댓글을 충분히 주의 깊게 읽지 않았습니다. ) 이는 해당 상위 디렉토리(귀하의 경우 dir)에서 달성할 수 있습니다.
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
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"라는 파일이 생성된 것을 확인할 수 있습니다.