
'dir'이라는 디렉터리가 있고 그 안에 'subdir'이라는 하위 디렉터리가 있습니다. Subdir에는 많은 파일이 있습니다. 이 파일 목록을 CSV 파일로 작성하고 Linux의 명령줄을 사용하여 'dir' 디렉토리에 저장하고 싶습니다. 내 코드는 csv 파일을 생성하지만 하위 디렉터리에는 저장하지만 디렉터리에는 저장하지 않습니다. 내가 어디서 잘못한 걸까요? 나는 dir 디렉토리에 있습니다.
dir$ ls subdir >names.csv
답변1
더 쉬운 대안으로 cd를 사용하여 하위 디렉터리로 이동할 수 있습니다.
printf "%s\n" * >../list.csv
이렇게 하면 쉼표 없이 개행으로 구분되고 개행으로 끝나는 목록이 제공됩니다. 열이 하나만 있는 degererated 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
.
이를 사용하면 dir에 자동으로 생성된 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"라는 파일이 생성된 것을 볼 수 있습니다.