저는 Manjaro GNU/Linux를 사용하고 있습니다. 이 디렉토리 아래에는 , 등 files
의 이름을 가진 하위 디렉토리가 약 650개 있습니다 .file1
file2
file3
각 하위 디렉터리에는 2~11개의 이미지가 있습니다 .tif
.
이전과 동일한 이름을 가진 동일한 하위 디렉터리에 있는 모든 이미지를 자동으로 .tif
변환 .jpeg
하거나 유지 하는 명령이나 스크립트를 작성하고 싶습니다 ..jpg
나는 다음과 같은 명령이 있다는 것을 알고 있습니다.
convert source.tif ~/converted.jpg
도울 수 있니?
감사해요!
답변1
가장 간단한 방법은 파일 이름 접미사를 사용하여 발견된 각 파일을 변환하는 find
짧은 인라인 스크립트를 실행하는 것 입니다..tif
find files/ -name '*.tif' -type f -exec sh -c '
for pathname do
convert "$pathname" "${pathname%.tif}.jpg"
done' sh {} +
위의 인라인 스크립트는 sh -c
배치에서 발견된 일반 파일의 경로명(접미사는 디렉토리 아래에 있음)으로 호출됩니다. 매개변수 대체는 값에서 접미사를 제거하고 끝에 추가합니다.find
.tif
files
${pathname%.tif}.jpg
.tif
$pathname
.jpg
문자열로 시작하는 ~650개의 하위 디렉터리만 찾고 다른 하위 디렉터리는 무시하는 files/file*/
대신 검색 경로 로 사용됩니다 .files/
files
file
이렇게 하면 파일이 제자리에 유지되지만 루프에서 명령 다음에 파일을 추가하면 .tif
성공적인 변환 후에 파일을 삭제할 수 있습니다.&& rm "$pathname"
convert
zsh
셸 에서는 find
셸의 고급 파일 이름 일치 및 문자열 조작 기능을 포기하고 사용할 수 있습니다.
for pathname in files/**/*.tif(D-.); do
convert $pathname $pathname:r.jpg
done
여기서는 files/**/*.tif(D-.)
이름이 디렉터리 안이나 아래에서 끝나는 모든 일반 파일 목록으로 확장됩니다. 끝에 와일드카드가 있으면 와일드카드 패턴이 일반 파일("숨겨진" 이름이 있을 수 있음)만 일치하게 됩니다..tif
files
(D-.)
그런 다음 경로 이름(파일 확장자가 없는 이름)의 "루트"가 :r
제공 됩니다 $pathname
.
하위 디렉터리의 파일 files/file*/**/*.tif(D-.)
로만 검색을 제한 하는 데 사용됩니다 .file*
셸을 사용하면 bash
다음과 같이 위와 비슷한 작업을 수행할 수 있습니다.
shopt -s dotglob failglob globstar
for pathname in files/**/*.tif; do
convert "$pathname" "${pathname%.tif}.jpg"
done
여기에 설정된 쉘 옵션을 사용하면 숨겨진 이름에 와일드카드 및 와일드카드 연산자를 사용할 수 있습니다 **
. 또한 zsh
셸의 기본값과 마찬가지로 일치하지 않는 패턴으로 인해 오류가 발생합니다 .
답변2
7,000개 이상의 파일을 사용하면 순차적으로 실행하는 데 오랜 시간이 소요되므로 오늘날의 멀티 코어 CPU를 활용하고 다음을 사용하는 것이 좋습니다.GNU 병렬병렬로 변환하도록 하세요. 속도가 더 빠를 뿐만 아니라 매우 간단하게 접미사를 작동하고 진행 보고서를 제공하며 실제로 아무것도 하지 않고도 무엇을 하는지 확인할 수 있는 시험 실행을 제공합니다.
다음과 같습니다 bash
.
shopt -s failglob globstar
parallel --dry-run magick {} {.}.jpg ::: files/**/*.tif
산출
magick files/file1/1.tif files/file1/1.jpg
magick files/file2/1.tif files/file2/1.jpg
magick files/file1/2.tif files/file1/2.jpg
magick files/file2/2.tif files/file2/2.jpg
magick files/file3/1.tif files/file3/1.jpg
magick files/file3/2.tif files/file3/2.jpg
올바르게 보이면 삭제 --dry-run
하고 실제 작업을 다시 수행하세요.
파일이 너무 많아 오류가 발생하는 경우 파일 이름을 magick
from 으로 파이프할 수 있습니다. 여기에 진행률 표시줄 find
도 추가했습니다 .--bar
find files -iname "*.tif" -print0 | parallel -0 --dry-run --bar magick {} {.}.jpg
일부 답변과 달리 TIFF 파일에 대문자 접미사가 있는 경우에도 작동합니다.
답변3
cd
하위 폴더가 포함된 홈 디렉터리를 입력한 후.
IFS=$'\n'
for i in $(find -type f -name "*tiff"); do
echo $i
convert $i $i.jpg
done
find -type f -name "*tiff" -exec rm {} \;
IFS
내부 필드 구분 기호입니다.
내가 본 문제 중 하나는 basename
파일의 내용을 추출할 수 없다는 것입니다.
큰 폴더로 이동하기 전에 먼저 작은 폴더에서 시도하는 것을 잊지 마세요.
답변4
다음과 비슷한 스크립트를 사용하겠습니다.
#!/bin/bash
if [[ $# -gt 0 ]]
then
if [[ -d $1 ]]
then
cd $1
else
echo "Given path leads to a file or the directory you are loking does not exist!"
exit 1
fi
fi
for dir in */
do
echo "Changing directory to $dir"
cd $dir
for image in *
do
if [[ -f "$image" ]]
then
filename="${image%.*}"
extension="${image##*.}"
if [[ "$extension" =~ ^ti[f]{1,2}$ ]]; then
echo "Converting $image to ${filename}.jpg"
convert "$image" -compress JPEG -quality 50 "${filename}.jpg"
fi
fi
done
cd - > /dev/null
done
스크립트를 설정하세요.
- BatchJPEGConvert.sh로 저장하세요.
- 명령을 사용하여
chmod 755 batchJPEGConvert.sh
파일을 실행 가능하게 만듭니다. - 다음 명령을 사용하여
sudo cp batchJPEGConvert.sh /usr/local/bin
시스템에서 스크립트에 액세스할 수 있도록 만드세요.
batchJPEGConvert.sh
또는 를 입력하여 이 스크립트를 실행할 수 있습니다 batchJPEGConvert.sh path
. 첫 번째 옵션은 현재 작업 디렉터리에서 스크립트를 실행합니다. 또 다른 옵션은 작업 디렉토리를 주어진 디렉토리로 변경하려고 시도합니다.길거기에서 스크립트를 실행하십시오. 이 스크립트는오직.tiff 또는 .tif 확장자로 끝나는 파일을 변환합니다. JPEG 압축도 적용됩니다.
이 스크립트는 다음과 같이 구성된 디렉터리에서만 작동합니다.
test
├── 1
│ ├── polski.jpg
│ └── polski.tiff
└── 2
├── polski.jpg
└── polski.tif