![Bash: 디렉터리 이름에 따라 파일 이름 만들기](https://rvso.com/image/109239/Bash%3A%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%20%EC%9D%B4%EB%A6%84%EC%97%90%20%EB%94%B0%EB%9D%BC%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%20%EB%A7%8C%EB%93%A4%EA%B8%B0.png)
다음과 같은 디렉토리 구조가 있다고 가정해 보겠습니다.Parent_dir/<name>/<date>/
Parent_dir
모든 하위 디렉터리를 탐색 하고 하위 디렉터리 내에 /<name>/<date>/
이름이 지정된 빈 텍스트 파일을 생성하기 위해 배치된 bash 스크립트를 어떻게 사용할 수 있습니까 ?<name>_<date>.txt
/<name>/<date>/
답변1
로부터 Parent_dir
:
for d in */*/; do f=${d/\//_}; touch -- "$d"/"${f::-1}.txt"; done
touch
기존 파일의 타임스탬프가 변경됩니다 .
touch
다음으로 교체하여 먼저 테스트 실행을 수행할 수 있습니다 echo
.
for d in */*/; do f=${d/\//_}; echo -- "$d"/"${f::-1}.txt"; done
for d in */*/
두 수준 깊이의 디렉터리를 반복할 수 있습니다.f=${d/\//_}
첫 번째 디렉터리 구분 기호를/
다음으로 바꾸고_
출력을 변수로 저장합니다.f
"$d"/"${f::-1}.txt"
디렉토리 이름으로 확장되고 그 뒤에 원하는 파일 이름이 옵니다. 변수에서${f::-1}
마지막을 제거합니다./
f
디렉터리 구분 기호가 /
변수와 함께 존재 하므로 d
in은 /
중복 "$d"/"${f::-1}.txt"
됩니다. 거의 모든 시스템이 //
Single 을 취하므로 /
이는 문제가 되지 않습니다. 또는 다음과 같이 드립할 수도 있습니다 /
.
for d in */*/; do f=${d/\//_}; touch -- "${d}${f::-1}.txt"; done
답변2
파일 이름을 문자 그대로 이름으로 지정하려면 name_date.txt
다음을 시도하십시오.
#!/bin/bash
for dir in $(find . -maxdepth 2 -mindepth 2 -type d)
do
touch "$dir"/name_date.txt
done
파일 이름을 로 지정하려면 <name>_<date>.txt
대신 다음을 수행하십시오.
#!/bin/bash
IFS=$'\n'
for dir in $(find . -maxdepth 1 ! -path . -type d)
do
for subdir in $(find "$dir" -mindepth 1 -type d)
do
base_dir=$(basename $dir)
base_subdir=$(basename $subdir)
touch "$base_dir"/"$base_subdir"/"$base_dir"_"$base_subdir".txt
done
done
답변3
find . -type d -exec sh -c '
case ${1//[!\/]/} in
"//" ) f=${1:2}; f=${f/\//_}; :> "$1/$f.txt" ;;
* ) false ;;
esac
' {} {} \; -prune
for d in */*/; do
f=${d/\//_}
:> "${d%?}/${f%?}.txt"
done