Lệnh Lệnh tìm chuỗi -exec thay thế chuỗi


1

Tôi đang cố gắng tìm các tệp JPG trong cây thư mục để thực thi lệnh "" để chuyển đổi nó thành PDF.

Vấn đề là mã tôi đang chạy để lại tệp trong cùng thư mục và tôi muốn di chuyển nó nhưng bảo toàn cấu trúc của cây tệp.

Những gì tôi đã thử cho đến nay là:

find . -iname '*.jpg' -exec mogrify -format pdf '{}' \;

Lệnh này hoạt động hoàn hảo. Tôi muốn thao tác "{}" chuyển một phần nội dung của nó;

{} = ./1/aa.xxx

và tôi muốn chuyển đổi nó thành:

{} = ./new/1/aa.pdf

nhờ @ mpez0 tôi có thể thay đổi một giải pháp:

find . -iname '*.jpg' | while read file ; do 
oldfile=${file##*/};
olddir=${file/"$oldfile"/""};
pdfdir=${file/'./''./PDF'};
pdfdir=${pdfdir/"$oldfile"/""};
savedir=${file/'./''./OLD'};
savedir=${savedir/"$oldfile"/""};
newfile=${oldfile/.[Jj][Pp][Gg]/.pdf};
mogrify -format pdf "$file"; 
mkdir -p "$pdfdir";
mkdir -p "$savedir";
mv -- "$olddir$newfile" "$pdfdir$newfile"; 
mv -- "$olddir$oldfile" "$savedir$oldfile"; 
done

Mã này làm gì:
find . -iname '*.jpg'tìm tất cả các tệp kết thúc whit jpg và JPG
while read file ; donếu hành động lấy tệp ani lưu thường trình trong biến file
oldfile=${file##*/};lấy ra tệp pat và lưu tên te của tệp trong biến oldfile
olddir=${file/"$oldfile"/""};lấy tên tệp để lưu pat olddir
pdfdir=${file/'./''./PDF'};thay đổi ./ thành ./pdf và lưu pat mới trong việc pdfdir
pdfdir=${pdfdir/"$oldfile"/""};lấy tên của tệp để lưu tệp pat pat pdfdir
savedir=${file/'./''./OLD'};thay đổi ./ thành ./old và lưu pat mới savedir
savedir=${savedir/"$oldfile"/""};lấy ra tên của tệp để lưu tệp pat pat trong savedir
newfile=${oldfile/.[Jj][Pp][Gg]/.pdf};lưu tên tệp mới sẽ được tạo để newfile
mogrify -format pdf "$file";chuyển đổi filesang pdf
mkdir -p "$pdfdir";tạo các thư mục của pat pdfdir
mkdir -p "$savedir";tạo các thư mục của pat savedir
mv -- "$olddir$newfile" "$pdfdir$newfile";di chuyển tệp pdf mới tạo vào tệp giám đốc pdf mv -- "$olddir$oldfile" "$savedir$oldfile";di chuyển tệp jpg cũ sang giám đốc cũ donekết thúc các thủ tục

Tôi hy vọng điều này sẽ giúp những người khác


mogrify có cờ -o cho vị trí đầu ra không? sẽ đơn giản hóa mã một chút. Ngoài ra, bạn đang sử dụng hệ điều hành nào? Cụ thể hơn, vỏ gì? Với tìm kiếm, chúng ta có thể giả định một vỏ Linux?
Rich Homolka

Giàu có, tôi đang sử dụng bash ngay cả trong mac như trong linux, không có mogrify nào không có nó.
Alejandro O'Byrne

@ AlejandroO'Byrne Vui lòng gửi giải pháp dưới dạng câu trả lời thay vì chỉnh sửa nội dung câu hỏi của bạn (Bạn có thể trả lời câu hỏi của chính mình ). Ngay cả bạn cũng có thể chấp nhận câu trả lời , đó là làm việc cho bạn.
αsнι

Câu trả lời:


2
find . -iname '*.jpg' | while read f ; do 
    new=`echo $f | sed -e 's/\.[Jj][Pp][Gg]$/.pdf/'`; 
    newd=`dirname $f`;
    newd="new/$newd" 
    mogrify -format pdf $f; 
    mv $new $newd; 
done

Tất nhiên, tôi khuyên bạn nên chạy tập lệnh lặp lại các lệnh mogrifymv. Nếu mogrifycung cấp tùy chọn đầu ra, hãy sử dụng tùy chọn đó thay vì mv. Bạn có thể thấy đơn giản hơn khi thực hiện tìm kiếm và thực hiện tất cả các mogrifybiến đổi, sau đó thu thập .pdf mới.


cảm ơn whit một chút thay đổi tôi nhận được giải pháp từ đường của bạn. CẢM ƠN
Alejandro O'Byrne

1

Nếu bạn sử dụng convertthay vì mogrify(một phần của cùng một bộ), lệnh của bạn sẽ trở thành:

find . -iname '*.jpg' -exec convert -format pdf '{}' new/'{}'.pdf \;

Không giống như mogrify, việc convertsử dụng không tạo ra phần mở rộng tệp được cập nhật, do đó bạn sẽ nhận được .jpg.pdf(cộng với viết hoa) làm phần mở rộng tệp mới, nhưng điều đó rất dễ thay đổi với rename:

find new -iname '*.jpg.pdf' -exec rename 's/\.[Jj][Pp][Gg]//' '{}' \;

Bạn có thể xóa các JPEG sau đó nếu bạn không cần giữ chúng (Tôi hy vọng bạn không cần lệnh đó đánh vần).


điều này không hoạt động
Alejandro O'Byrne

Cái gì không hoạt động? Tôi đã kiểm tra cả hai lệnh với một tệp trong một thư mục tạm thời. Có thể cấu trúc thư mục cần được tạo trước, sử dụng find . -type d -exec mkdir new/'{}' \;. Lưu ý rằng điều này sẽ tạo các thư mục ngay cả khi không có tệp JPEG trong đó. Nó sẽ cần phức tạp hơn nhiều để tính đến điều này, nhưng bạn luôn có thể xóa các thư mục trống sau đó find new/ -type d -exec rmdir '{}' \;.
AFH
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.