폴더의 모든 png에 대해 txt 파일을 만들고 싶습니다


12

이 스크립트가 있습니다

#!/bin/bash

folder='/home/data/mnist/training'

for filePng in $folder/*
do
touch $filePng.txt
done

이라는 파일의 001.png경우 001.png.txt대신 대신 생성 됩니다 001.txt.

이것을 어떻게 수정할 수 있습니까?


4
변수를 인용하는 것은 좋은 습관입니다. 셸 스크립트는 시작부터 완벽하게 설계되지 않고 시간이 지남에 따라 진화 한 이상한 언어이므로 불행히도 이와 같은 성가신 것들이 필요합니다. 변수를 인용하지 않으면 변수 내용의 공백이나 별표가 이상한 방식으로 중단됩니다. 스크립트를보다 강력하게 만들려면 항상 큰 따옴표로 변수를 사용하십시오. 여기에서, 당신은 말을 for filePng in "$folder"/*하고 touch "$filePng".txt - a로 덧붙일 때 당신은 단지 그들을 인용 있습니다 $.
Muzer

3
이것은 XY 문제처럼 보입니다 ... 왜 이것을하려고합니까?
JeromeJ

답변:


16

basename여기서 명령을 사용할 수 있습니다 .

touch "$folder/$(basename "$filePng" .png).txt"

추가 사항에 유의하십시오 $folder/. basename 명령이 경로를 제거하므로 필요합니다.


매개 변수 확장 및 명령 대체를 인용 할 것을 제안 할 수 있습니까?
Tom Fenech

@TomFenech 네, 아마도 전체 문자열을 인용하는 것이 좋습니다. 내 답변을 편집했습니다.
Wayne_Yux

왜 당신이 내부 따옴표를 제거했는지 잘 모르겠습니다 $filePng.
Tom Fenech

1
$( )새로운 인용 문맥을 설정 하기 때문에 아닙니다 .
Tom Fenech

2
오, 당신은 옳습니다-오늘 뭔가 새로운 것을 배웠습니다 ;-)
Wayne_Yux

31

쉘의 매개 변수 확장 기능을 사용하여 기존 확장을 제거 할 수 있습니다

${parameter%pattern}'패턴'은 '매개 변수'의 끝과 일치합니다. 결과는 가장 짧은 일치 항목이 삭제 된 'parameter'의 확장 된 값입니다.

따라서 귀하의 경우, 교체 $filePng.txt"${filePng%.png}.txt"


10

스틸 드라이버가 이미 언급 한 것 (파라미터 확장)에 대한 변형으로 문자열 교체를 사용하여 작업을 수행 할 수 있습니다. 또한 변수를 인용해야합니다. 아래는 편집 한 스크립트입니다.

#!/bin/bash

folder='/home/data/mnist/training'

for filePng in "$folder"/*
do
    touch "${filePng/.png/.txt}"
done

9

당신이 경우 많은 파일을 수행 한 여러 경우 꽤 많은 시간이 소요 그들 각각에 대해 새로운 프로세스를 (포크 할 필요가 없습니다 그래서, 그것은 한 번에 두 개 이상의 파일 "터치"에 가치가있을 것입니다 만듭니다 천 번).

옵션 1 : 패턴 대체 + xargs

이 옵션은 touch한 번에 명령에 여러 경로를 제공하며 일반적으로 수천 또는 시스템이 단일 명령 행에 맞을 수있는 모든 경로를 제공합니다 .

find "$folder" -mindepth 1 -maxdepth 1 -name '*.png' -print0 |
sed -ze 's/\.png$/.txt/' |
xargs -r0 -- touch --

옵션 2 : 파라미터 확장 + 명령 출력 리디렉션

이 옵션은 전혀 실행되지 않지만 touch하위 프로세스가 전혀 필요없는 Bash / Bourne / POSIX 쉘 기능을 대신 사용합니다.

for f in "$folder"/*.png; do
    : >> "${f%.png}.txt"
done

4

.png이름 중간에 파일이 없다고 확신하는 경우 매개 변수 확장으로 배열을 사용할 수 있습니다.

pngs=( /path/to/pngs/*.png )
touch "${pngs[@]/.png/.txt}"

이것은 .png배열로 끝나는 파일의 모든 경로를 저장 한 다음 매개 변수 확장을 사용하여 각 .txt파일을 대체 .png하여 파일 목록을 작성합니다 .txt.

파일이 너무 많으면 같은 호출에 대한 인수로 모두 전달 될 수없는 경우 파일이 손상 될 수 있습니다 touch.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.