5개의 빈 디렉터리가 있습니다.
[X]$ ls
dir_1 dir_2 dir_3 dir_4 dir_5
텍스트 파일에 해당 디렉터리의 이름이 포함되도록 각 디렉터리에 텍스트 파일을 만들려면 어떻게 해야 합니까? 예를 들어, dir_1
텍스트 파일이 포함되고 file_1.txt
텍스트 파일에 dir_1
텍스트가 포함되고, dir_2
텍스트 파일에 file_2.txt
텍스트가 포함 되는 dir_2
식입니다.
정보를 검색했지만 알 수 없습니다. 최근에 리눅스를 배우기 시작했습니다. 다음과 같은 작업을 수행해야 합니까?
find . -type d -exec touch (something?)
for 루프를 사용하여 이 작업을 수행할 수 있습니까?
답변1
for d in dir_*; do
printf "%s\n" "$d" > "$d/file_${d##*_}.txt"
done
$d
모든 디렉토리 이름으로 확장됩니다.${d##*_}
$d
매개변수 확장 섹션에서 자세한 내용을 읽어보세요 .BASH 매뉴얼또는POSIX 사양.printf "%s\n" "$d" > "$d/file_${d##*_}.txt"
해당 디렉터리의 txt 파일에 디렉터리 이름을 씁니다.
한 줄로:
for d in dir_*; do printf "%s\n" "$d" > "$d/file_${d##*_}.txt"; done
printf
전자에서는 올바르게 처리할 수 있지만 후자에서는 처리할 수 없는 특수한 경우가 있기 때문에 동의합니다 . 하지만 echo
제시된 특정 사례에서는 echo
문제가 되지 않습니다 . 더 많은 정보를 찾아보세요왜 printf가 echo보다 나은가요?.
로 시작하는 디렉터리가 아닌 항목을 피해야 하는 경우 옵션 1은 위 스크립트의 문 앞에 테스트를 추가하는 것입니다 dir_
. 디렉토리만 일치시키려면 옵션 2를 사용하십시오.[ -d "$d" ] &&
printf
dir_*/
for d in dir_*/; do
dirn=${d%%/}
printf "%s\n" "$dirn" > "${d}file_${dirn##*_}.txt"
done
답변2
find . -name 'dir_[0-9]*' -type d -execdir bash -c 'name=$0;printf "${name##*/}\n" > "$name/file_${name##*_}.txt"' '{}' \;
찾기 결과를 사용하여 여러 명령 실행-execdir
name=$0;
=> 각 디렉토리 이름을 $name 변수에 저장하고 처리합니다.