다음 bash 스크립트를 사용하여 생성된 파일 목록에서 파일 확장자를 제거하려고 합니다.
#!/bin/bash
file_list=$(find . -type f) #assuming that the files are stored in the same directory
trimmed_file_list=$(printf '%s\n' "${file_list[@]%.*}")
printf '%s\n' "${trimmed_file_list[@]}"
이 확장 프로그램은 확장 프로그램을 정리했습니다.마지막목록에 항목이 있지만 이전 항목은 없습니다.
예를 들어 다음 목록을 원합니다.
file1.pdf
file2.pdf
file3.png
~이 되다
file1
file2
file3
하지만 내가 얻는 것은 다음과 같습니다.
file1.pdf
file2.pdf
file3
나는 이것을 루프에서 하고 싶지 않고, 매개변수 확장을 사용하고 싶습니다. 파일의 마지막 확장자만 제거하고 싶기 때문에 잘라내기를 피하고 싶습니다.
매개변수 확장에 관한 주제가 상당히 많고, bash가 find
개행 때문에 질식할 수도 있는 것 같습니다... 잘 모르겠습니다. 기존의 다른 주제가 문제를 설명하는 경우 무슨 일이 일어나고 있는지 완전히 이해하지 못합니다.
관련이 있는 것 같지만 내 문제를 해결하지 못하는 것 같은 주제:
답변1
하나의 명령으로 모든 것을 할 수 있습니다.
find /path/to -type f -execdir bash -c 'printf "%s\n" "${@%.*}"' bash {} +
답변2
나는 당신이 문자열보다는 배열을 만들고 싶어할 것이라고 믿습니다.
IFS=$'\n' # split on newline only
set -o noglob # disable the glob part
file_list=($(find . -name '*.*' -type f))
또는 bash 4.4+를 사용하면 파일 경로를 줄바꿈으로 변경하지 마세요.
readarray -td '' file_list < <(find . -name '*.*' -type f -print0)
그러면 여기서 다시 배열 변수를 사용하는 것이 더 합리적이기는 하지만 매개변수 확장이 작동해야 합니다.
trimmed_file_list=("${file_list[@]%.*}")
코드 예제에서는 문자열을 생성한 다음 전체 문자열에서 마지막 점 문자 뒤의 모든 항목을 제거하기 위해 매개변수 확장을 요청합니다.
답변3
코드에 배열이 포함되어 있지 않습니다. 또한 파일 이름 목록을 문자열에 넣습니다 $file_list
. 문자열의 내용은 종료되고 file3.png
매개변수 대체는 .png
문자열에서 제거되어 마지막 파일 이름에 파일 이름 접미사가 없는 파일 이름 문자열이 남습니다.
여러 개의 개별 개체(경로 이름)를 단일 문자열에 넣으면 자동으로 이름에 공백(또는 문자열이 사용하는 구분 기호)이 포함된 파일에서 스크립트가 제대로 작동하지 못하게 됩니다. 여전히 빈 출력을 분할하므로 배열을 사용하면 도움이 되지 않습니다 find
.
현재 디렉터리의 모든 파일 이름이나 아래 일반 파일의 확장자를 제거하려면 다음을 수행하십시오.
find . -type f -name "*.*" -exec sh -c '
for pathname do
printf "Would move %s to %s...\n" "$pathname" "${pathname%.*}"
# mv -i "$pathname" "${pathname%.*}"
done' sh {} +
이름에 점이 하나 이상 포함된 일반 파일을 찾습니다. 이러한 파일의 경로 이름은 해당 파일을 반복하는 작은 쉘 스크립트로 일괄 처리됩니다. 파일 이름의 마지막 점과 그 뒤의 모든 것을 제거하여 파일 이름을 바꾸는 쉘 스크립트입니다. 실제 명령은 안전상의 이유로 mv
주석 처리되었습니다 .
이 find
명령은 내부 쉘 스크립트에 대한 경로 이름 생성기 역할을 하여 공백, 줄 바꿈 및 탭이 포함된 경로 이름을 올바르게 처리하도록 보장합니다. 명령의 출력을 변수에 저장할 필요가 없습니다.
경로 이름 배열이 있는 경우 아마도 다음을 사용하여 생성되었을 것입니다.
shopt -s globstar nullglob
file_list=( **/*.* ) # get pathnames of files with dots in their names
그런 다음 접미사 없이 경로 이름을 출력할 수 있습니다.
printf '%s\n' "${file_list[@]%.*}"
이것이 당신에게 도움이 될지 모르겠습니다. 네가 원한다면사용접미사가 없는 경로 이름인 경우 위 명령을 사용한 출력은 printf
다음과 같습니다.잘못된해야 할 일(더 이상 이상한 경로 이름을 다루지 않게 될 것입니다). 따라서 파일 이름 접미사를 제거하는 시기와 방법은 결과로 수행하려는 작업에 따라 다릅니다.
관련된: