답변:
basename여기서 명령을 사용할 수 있습니다 .
touch "$folder/$(basename "$filePng" .png).txt"
추가 사항에 유의하십시오 $folder/. basename 명령이 경로를 제거하므로 필요합니다.
$filePng.
$( )새로운 인용 문맥을 설정 하기 때문에 아닙니다 .
스틸 드라이버가 이미 언급 한 것 (파라미터 확장)에 대한 변형으로 문자열 교체를 사용하여 작업을 수행 할 수 있습니다. 또한 변수를 인용해야합니다. 아래는 편집 한 스크립트입니다.
#!/bin/bash
folder='/home/data/mnist/training'
for filePng in "$folder"/*
do
touch "${filePng/.png/.txt}"
done
당신이 경우 많은 파일을 수행 한 여러 경우 꽤 많은 시간이 소요 그들 각각에 대해 새로운 프로세스를 (포크 할 필요가 없습니다 그래서, 그것은 한 번에 두 개 이상의 파일 "터치"에 가치가있을 것입니다 만듭니다 천 번).
xargs이 옵션은 touch한 번에 명령에 여러 경로를 제공하며 일반적으로 수천 또는 시스템이 단일 명령 행에 맞을 수있는 모든 경로를 제공합니다 .
find "$folder" -mindepth 1 -maxdepth 1 -name '*.png' -print0 |
sed -ze 's/\.png$/.txt/' |
xargs -r0 -- touch --
이 옵션은 전혀 실행되지 않지만 touch하위 프로세스가 전혀 필요없는 Bash / Bourne / POSIX 쉘 기능을 대신 사용합니다.
for f in "$folder"/*.png; do
: >> "${f%.png}.txt"
done
for filePng in "$folder"/*하고touch "$filePng".txt- a로 덧붙일 때 당신은 단지 그들을 인용 있습니다$.