Batch đổi tên tập tin hình ảnh theo tuổi cộng với ngày và biến thành tên tệp


7

Câu hỏi được viết lại hoàn toàn do những điều học được từ hai câu trả lời và nhận xét đầu tiên mà tôi không biết khi lần đầu tiên hỏi.


Sau buổi chụp hình, tôi trở về nhà với những tập tin trông như thế _DSC1234.NEF. NEFlà định dạng tệp thô của máy ảnh của Nikon, vì vậy EXIFdữ liệu có trong các tệp.

Tôi muốn tự động đổi tên chúng với ba phần:

  1. Ngày tạo theo định dạng YYYYMMDD
  2. Tên bắn
  3. Số lượng hình ảnh

Vì vậy, tên tập tin cuối cùng sẽ trông như thế này

20140707_NameOfShoot_0001.NEF

Có một vài vấn đề:

quảng cáo 1. Ngày tạo đôi khi tôi chỉ có thể sao chép và đổi tên các tệp một vài ngày sau khi chụp, vì vậy ngày sẽ phản ánh ngày chụp ảnh, không phải ngày được sao chép. mtimecó vẻ như đặt cược tốt nhất ở đây hoặc nếu có thể ngày tạo ra từ EXIF.

ad 2: Name of Shoot Đây lý tưởng sẽ là một biến tôi có thể đặt làm tham số khi gọi tập lệnh.

quảng cáo 3. Số lượng hình ảnh Điều này sẽ phản ánh tuổi của hình ảnh, tuổi nhất có số lượng thấp nhất. Vấn đề là máy ảnh thường khởi động lại đánh số 0000sau khi chúng nhấn 9999. Vì vậy, 9995-9999có khả năng có thể già hơn 0000-0004. Tôi đang tìm kiếm một giải pháp phản ánh tuổi tập tin và trong trường hợp đặc biệt này sẽ đổi tên

  • _DSC0000.NEF -> 20140707_FOO_0004.NEF
  • _DSC0001.NEF -> 20140707_FOO_0005.NEF
  • _DSC0002.NEF -> 20140707_FOO_0006.NEF
  • ...
  • _DSC9997.NEF -> 20140707_FOO_0001.NEF
  • _DSC9998.NEF -> 20140707_FOO_0002.NEF
  • _DSC9999.NEF -> 20140707_FOO_0003.NEF

Một lần nữa, mtimehoặc có thể ngày tạo ra từ EXIFcó vẻ đúng.


Từ đây tôi có một giải pháp làm việc đổi tên tất cả các tệp .NEF trong một thư mục theo ngày:

find -name '*.NEF' | 
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.NEF\n", $0, a++ }' | 
bash 

Ngày sửa đổi tập tin mã hóa cứng và tên bắn hoạt động tốt, nhưng sẽ thật tuyệt nếu nó có thể được tự động hóa.

Đối với timestamp Tôi tìm các bài viết trên strftime(), mktime(), systime()nhưng tôi không hiểu làm thế nào để sử dụng chúng để trở lại tập ngày sửa đổi. Tôi cũng đã cố gắng thêm DATE=$(date +"%Y%m%d")và thêm $DATEvào gawk-line, điều này dẫn đến việc xóa tất cả các tệp trong thư mục hiện tại (và có lẽ là dù sao đi nữa và không thay đổi thời gian).

Đối với biến, tôi đã thử

gawk 'BEGIN{ a=1 }{ printf "mv %s $1_%04d.NEF\n", $0, a++ }' | 

và gọi tập lệnh với ./rename FOO, nhưng FOO bị bỏ qua khi đổi tên.


Tôi cũng đã thử sử dụng digikam để đổi tên hàng loạt, hoạt động tốt nhưng mất khoảng 1 giây / tệp trên 1600 ảnh cuối cùng của tôi, mà tôi thấy hơi chậm
Seul

Tôi đã thử stat -c %W -- *trong thư mục nhà của tôi bây giờ và chỉ trả lại một loạt các số không. Ngoài ra các man findtài liệu trang của GNU rằng nó có thể xử lý -printf strftimecác chuỗi để xử lý %A, %Cthay đổi trạng thái và sửa đổi %Tnhưng không có gì về việc tạo hoặc sinh tệp. Mặc dù điều đó không đến gần để chứng minh một cách dứt khoát rằng nó không thể được thực hiện, tôi nghĩ đó là một chỉ báo tốt rằng nó không phải là một chức năng phổ biến.
mikeerv

hm sự khác biệt giữa thay đổi và sửa đổi là gì? Điều đó có thể sẽ làm cách nào. Nếu sinh không có sẵn, bạn có thể xem giải pháp trên sử dụng để sắp xếp không? Vì tôi không thực sự hiểu nó đang làm gì.
Seul

đó là thay đổi trạng thái. Hãy nhìn vào đây - Tôi nghĩ đó cũng là một chỉ số khá tốt. Có thể có các hệ thống tệp báo cáo về thời gian tạo - tôi không chắc chắn - nhưng tôi không nghĩ nhiều người làm như vậy.
mikeerv

lớn, cảm ơn rất nhiều và vâng, điều đó nên làm. bất kỳ ý tưởng về làm thế nào tôi có thể đặt nó vào tên tập tin của tôi?
Seul

Câu trả lời:


8

Hầu hết các thông báo không theo dõi ngày tạo tập tin¹. Dù sao thì ngày sáng tạo cũng không rõ ràng (sao chép một tập tin có tạo ra một tập tin mới không?). Bạn có thể sử dụng thời gian sửa đổi của tệp, theo cách hiểu hợp lý vào ngày mà phiên bản mới nhất của dữ liệu được tạo. Nếu bạn tạo các bản sao của tệp, hãy đảm bảo giữ lại thời gian sửa đổi (ví dụ: cp -phoặc cp -anếu bạn sử dụng cplệnh, không để trống cp).

Một vài định dạng tệp có một trường bên trong tệp nơi ứng dụng người tạo điền vào ngày tạo. Đây thường là trường hợp cho ảnh, trong đó máy ảnh sẽ điền một số dữ liệu Exif vào hình ảnh JPEG hoặc TIFF, bao gồm cả thời gian tạo. Định dạng hình ảnh NEF của Nikon bao bọc xung quanh TIFF và cũng hỗ trợ Exif.

Có các công cụ làm sẵn để đổi tên các tệp hình ảnh chứa dữ liệu Exif để bao gồm ngày tạo trong tên tệp. đổi tên hình ảnh bao gồm ngày tạo trong tên chương trình hai giải pháp, với ExifToolexiv2 .

Tôi không nghĩ một trong hai công cụ cho phép bạn bao gồm một bộ đếm trong tên tệp. Bạn có thể thực hiện đổi tên theo hai lần: đầu tiên bao gồm ngày (với độ phân giải càng cao càng tốt để giữ lại thứ tự) trong tên tệp, sau đó đánh số các tệp theo phần ngày đó (và bỏ qua thời gian). Vì các máy ảnh DSLR hiện đại có thể tạo ra các loạt hình ảnh (D4 của Nikon chụp ở tốc độ 11 khung hình / giây), nên giữ lại tên tệp gốc trong giai đoạn đầu tiên, vì nếu không, nó có khả năng dẫn đến một số tệp có cùng tên tệp.

exiv2 mv -r %Y%m%d-%H%M%S:basename: *.NEF
# exiv2 uses `strftime(3)`, so `%Y%m%d-%H%M%S` returns YYYYMMDD-hhmmss
# :basename: is a naming variable exiv2's `-r`-handle provides. See `exiv2 -h` for more  
# Now you have files with names like 20140630-235958_DSCC1234.NEF.
# Note that chronological order and lexicographic order agree with this naming format.
i=10000
for x in *.NEF; do
  i=$((i+1))
  mv "$x" "${x%-*}_FOO_${i#1}.NEF"
done

${x%-*}loại bỏ phần sau -nhân vật. Biến iđếm được đếm từ 10000 và được sử dụng với 1chữ số hàng đầu bị tước; đây là một mẹo để có được các số 0 đứng đầu để tất cả các giá trị bộ đếm có cùng số.

Đổi tên tệp bằng cách tăng một số trong tên tệp có các giải pháp khác để đổi tên một nhóm tệp để bao gồm bộ đếm.

Nếu bạn muốn sử dụng dấu thời gian của tệp thay vì dữ liệu Exif, hãy xem Đổi tên một bó tệp có dấu thời gian được sửa đổi ngày ở cuối tên tệp?


Như một lưu ý chung, không tạo mã shell và sau đó chuyển nó thành shell. Nó không cần thiết phải phức tạp. Ví dụ, thay vì

find -name '*.NEF' | 
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.NEF\n", $0, a++ }' | 
bash

bạn có thể viết

find -name '*.NEF' | 
gawk 'BEGIN{ a=1 }{ system(sprintf("mv %s %04d.NEF\n", $0, a++)) }'

Lưu ý rằng cả hai phiên bản có thể dẫn đến kết quả thảm khốc nếu một tên tập tin chứa ký tự đặc biệt vỏ (như dấu cách, ', $, `, vv) vì tên tập tin được hiểu là mã shell. Có nhiều cách để biến mã này thành mã mạnh mẽ, nhưng đây không phải là cách tiếp cận dễ nhất, vì vậy tôi sẽ không theo đuổi cách tiếp cận đó.


¹ Lưu ý rằng có cái gì đó gọi là “ctime”, nhưng ckhông phải dành cho sự sáng tạo , đó là vì sự thay đổi . Thời gian thay đổi mỗi khi có bất cứ điều gì thay đổi về tệp, trong nội dung của nó hoặc trong siêu dữ liệu của nó (tên, quyền, mật). Ctime là khá nhiều phản đề của một thời gian sáng tạo.


Bạn đưa ra một quan điểm rất chung chung và sau đó dựa trên các ví dụ rất cụ thể - điều này rất gần với một lập luận vô căn cứ . Không tạo mã shell sau đó chuyển nó sang shell là câu lệnh mà tôi đề cập đến. Có một câu trả lời khác ở đây đã thực hiện điều này một cách mạnh mẽ, nhưng phương pháp mà bạn dường như đã bỏ qua hoàn toàn.
mikeerv

Cảm ơn vì đầu vào của bạn. Nó hoạt động khá tốt nhưng có hai vấn đề nhỏ và một vấn đề lớn hơn.
Seul

@Seul Tên tập tin gốc trông như thế nào? Tôi nghĩ rằng đó NameOfShootlà từ tên tập tin gốc. Về ngày tháng, tôi không quen với định dạng NEF - nó có bao gồm tem tạo bên trong định dạng tệp không? Ví dụ, hình ảnh JPEG có thể bao gồm ngày mà hình ảnh được chụp (đó là một phần của dữ liệu EXIF), nhiều máy ảnh (nhưng không phải tất cả) làm điều đó. Về cách sắp xếp, bạn có muốn tệp cũ nhất là 0001, tệp cũ nhất tiếp theo là 0002, v.v. không?
Gilles 'SO- ngừng trở nên xấu xa'

vâng, NEF là định dạng Raw của máy ảnh của Nikon, vì vậy tất cả các exif si đều có mặt. định dạng ban đầu là _DSC1234.NEF, cũng sẽ thêm nó vào câu hỏi ban đầu.
Seul

và có, cũ nhất nên lấy số thấp nhất. Phần cứng trên một sidenote: Tôi được hỏi bởi stackexchange nếu tôi muốn trò chuyện hơn là thêm tất cả những điều này vào bình luận. Tôi không quá quen thuộc với nghi thức ở đây, xin vui lòng cho tôi biết nếu tôi có thể cải thiện phong cách của mình.
Seul

4
stat --printf='}" "%z_${SN}_${LINENO}"\n' -- * | 
nl -nln -w1 -s '' |
sort -k2,3 | 
sed 's| ..:[^_]*||;s|-||g;s|^|echo mv "${|' |
SN=SHOOTNAME sh -s -- *

Lệnh trên sẽ làm những gì bạn cần. Nó có thể có mục đích chung hơn bạn yêu cầu - nhưng vui lòng xem phần dưới của câu trả lời này để biết ví dụ cụ thể hơn.

Nó hoạt động bằng cách điền vào *tất cả các tệp trong thư mục hiện tại và in ra thời gian thay đổi của chúng. Đối với chỉ các tệp trong thư mục hiện tại có chứa hậu tố, .NEFbạn sẽ muốn thay đổi ngôi *sao ở cuối cả hai dòng 1 và 5 thành *.NEF. Nó nối thêm một số biến shell và dấu ngoặc kép ở cuối - tên chỉ tồn tại ở đầu kia của đường ống trong shlớp con.

Ngoài ra, bởi vì chúng tôi chỉ định tên tệp chỉ theo thứ tự toàn cầu của chúng - hoặc các ${1}tham số loại vỏ này hoạt động tốt với bất kỳ tên tệp nào - bất kỳ ký tự lạ nào nó có thể chứa.

Bây giờ lệnh bao gồm một echo- nó đã được ghi. Chạy về cơ bản là không hoạt động - nó chỉ cho bạn thấy những gì nó muốn làm. Đây là đầu ra của nó từ thư mục nhà của tôi trước khi cho nó vào sh:

echo mv "${2}" "20140611_${SN}_${LINENO}"
echo mv "${4}" "20140614_${SN}_${LINENO}"
echo mv "${11}" "20140617_${SN}_${LINENO}"
echo mv "${7}" "20140622_${SN}_${LINENO}"
echo mv "${8}" "20140622_${SN}_${LINENO}"
echo mv "${1}" "20140624_${SN}_${LINENO}"
echo mv "${10}" "20140704_${SN}_${LINENO}"
echo mv "${5}" "20140704_${SN}_${LINENO}"
echo mv "${9}" "20140704_${SN}_${LINENO}"
echo mv "${12}" "20140705_${SN}_${LINENO}"
echo mv "${3}" "20140705_${SN}_${LINENO}"
echo mv "${13}" "20140706_${SN}_${LINENO}"
echo mv "${6}" "20140706_${SN}_${LINENO}"

Đây là sau sh:

mv Desktop-1 20140611_SHOOTNAME_1
mv Library 20140614_SHOOTNAME_2
mv target.txt 20140617_SHOOTNAME_3
mv script.sh 20140622_SHOOTNAME_4
mv script.sh~ 20140622_SHOOTNAME_5
mv Desktop 20140624_SHOOTNAME_6
mv shot-2014-06-22_17-11-06.jpg 20140704_SHOOTNAME_7
mv Terminology.log 20140704_SHOOTNAME_8
mv shot-2014-06-22_17-10-16.jpg 20140704_SHOOTNAME_9
mv test 20140705_SHOOTNAME_10
mv Downloads 20140705_SHOOTNAME_11
mv test.tar 20140706_SHOOTNAME_12
mv new
file 20140706_SHOOTNAME_13

Bạn có thể nhận thấy rằng đầu ra của tôi hiển thị một vài tệp hình ảnh đã được đặt tên cho thời gian tạo của chúng nhưng tên được gán mới của chúng không khớp. Đây không phải là hiệu ứng của sort- hoạt động theo quy định - mà là những tệp cuối cùng có thay đổi trạng thái vào ngày đó. Tuy nhiên, như bạn đã chỉ định trong các nhận xét về câu hỏi ctimenày là tài sản bạn đang tìm kiếm, đó là loại tài sản và tên được cung cấp ở đây. Tuy nhiên, đây là statđầu ra của tên tệp được đính kèm:

stat -c '%z %n' -- *

2014-06-24 16:50:09.110283839 -0700 Desktop
2014-06-11 23:34:02.981981145 -0700 Desktop-1
2014-07-05 01:00:43.213344635 -0700 Downloads
2014-06-14 10:32:13.537014418 -0700 Library
2014-07-04 23:02:25.079690701 -0700 Terminology.log
2014-07-06 11:24:05.398936386 -0700 new
file
2014-06-22 11:26:53.658004123 -0700 script.sh
2014-06-22 11:26:53.658004123 -0700 script.sh~
2014-07-04 13:34:00.063296353 -0700 shot-2014-06-22_17-10-16.jpg
2014-07-04 13:34:00.066629687 -0700 shot-2014-06-22_17-11-06.jpg
2014-06-17 19:59:38.475358571 -0700 target.txt
2014-07-05 23:53:39.097065292 -0700 test
2014-07-06 00:38:57.060521397 -0700 test.tar

Đầu ra trên cũng sẽ giúp tôi chứng minh toàn bộ đường ống đang làm gì.

  • Vì vậy, stat --printf='}" "%z_${SN}_${LINENO}"\n'in ra các dòng trông như:

    }" "YYYY-MM-DD HH:MM:SS.NS -TZ_${SN}_${LINENO}"

... Đâu YMDHMS.NS -TZlà những strftimethành phần khác nhau mà họ đại diện cho ctime. Định dạng đầu ra của nó giống hệt với %w- thời gian sinh tệp %x- thời gian truy cập lần cuối - hoặc %y- lần sửa đổi cuối cùng, và vì vậy thay thế bất kỳ một trong số này cho %zcâu lệnh trên sẽ mở rộng thay cho giá trị của chúng. Như chúng ta đã thảo luận trong các ý kiến, %w- thời gian sinh tệp - không phải là một thuộc tính đáng tin cậy và khi không được hỗ trợ, nó chỉ mở rộng ra 0.

Nó thực hiện điều này cho mọi tập tin shell shell cho nó trong *hoặc bất kỳ shell nào bạn cung cấp cho nó - chẳng hạn như *.NEFchỉ các tệp trong thư mục hiện tại có .NEFhậu tố.

  • Danh sách đó được trao cho các nlsố mà mỗi dòng tăng thêm 1. Các dòng của nó -nđược căn lntrái và không được đệm với số thứ tự tối thiểu -wlà 1 và chỉ một ''chuỗi null để phân biệt -schúng từ nội dung của dòng. Nó xuất ra:

    I}" "YYYY-MM-DD HH:MM:SS.NS -TZ_${SN}_${LINENO}"

... Đâu Ilà số lượng của mỗi dòng.

  • sortsắp xếp đầu vào của nó từ trường -k2,3thứ hai đến thứ ba - hoặc trên YYYY-MM-DD HH:MM:SS.NS. Vì tại thời điểm này, chất lượng duy nhất của bất kỳ dòng nào là Ihoặc ngày và Ibị bỏ qua, không cần phải cụ thể hơn điều đó. Điều này cũng giải quyết nhận xét bạn đã thực hiện liên quan đến các tệp được đặt tên theo số chứ không phải theo ngày. Lẽ ra tôi nên thực hiện sorttrước đó sedngay từ đầu nhưng điều đó không xảy ra với tôi để sắp xếp theo phút và giây và tương tự.

Cơ sở thử nghiệm của tôi cho điều này đã được tạo ra như sau:

for s in 9 8 7 6 5 4 3 2 1; do touch $s && sleep 1; done

Nếu tôi sort sau sed - như tôi đã làm trước khi chỉnh sửa này - thì điều này sẽ đổi tên các tệp 9thành ${DATE}.SHOOTNAME.9YMDcác trường của mỗi tệp giống hệt nhau và sortsẽ không ảnh hưởng đến thứ tự dòng của chúng. Nhưng với sự điều chỉnh này, lệnh này sortdành riêng cho nano giây và do đó 9được đổi tên thành ${DATE}.SHOOTNAME.1và ngược lại cho 1. Cảm ơn, @Seul, vì đã chú ý đến điều đó.

  • sedsau đó loại bỏ chuỗi đầu tiên trông giống như <space><any char><any char>:<colon>và tất cả các ký tự theo sau ^không phải là _dấu gạch dưới. Vì vậy, tại thời điểm này, dòng trông như:

    I}" "YYYY-MM-DD_${SN}_${LINENO}"

... tiếp theo nó loại bỏ tất cả -dấu gạch ngang. Và cuối cùng nó chèn echo mv "${vào ^đầu mỗi dòng, vì vậy nó trông như thế này:

echo mv "${I}" "YYYYMMDD_${SN}_${LINENO}"
  • Cuối cùng một hình shelip được gọi với biến môi trường được $SNkhai báo - ở đây giá trị của nó là SHOOTNAME. POSIX chỉ định rằng trình bao tăng var $LINENOcho mỗi dòng mà nó đọc, vì vậy với mỗi dòng chúng ta cung cấp cho nó giá trị đó trong tên tệp sẽ mở rộng thành một hơn so với dòng cuối cùng. Nếu - như ý kiến ​​của bạn chỉ ra - vì một số lý do, điều này không xảy ra, một sự thay thế hoàn toàn hợp lệ sẽ được $((i=i+1))in lần đầu tiên stattrong dòng 1 của đường ống và như tôi đã cung cấp trong một ví dụ cụ thể dưới đây.

Shell cũng được gọi với các tham số vị trí được đặt thành toàn cầu của chúng ta - ở đây là *sao cho tất cả các tệp trong thư mục hiện tại. Như đã đề cập, *.NEFtrong dòng này và trong dòng đầu tiên sẽ chỉ hoạt động trên các tệp trong thư mục hiện tại với hậu tố tên tệp của .NEF.

Miễn là toàn cầu của nó giống như trong dòng đầu tiên, nó sẽ toàn cầu theo thứ tự như nlđược đánh số chúng. Vì vậy, bất kể dòng nào xảy ra "${1}"sẽ mở rộng thành cùng tên tệp mà chúng ta đã gán cho nó theo nlđầu ra của. Bằng cách này, bạn có thể đổi tên các tệp theo thứ tự ngày một cách nhanh chóng và an toàn và theo đúng thứ tự.

  • Như đã đề cập, tôi đã ghi lệnh echoở đây. Nhưng nếu bạn chạy echovà thấy nó phù hợp với bạn sau tất cả bạn sẽ cần phải xóa echo.

Như thế này:

stat --printf='}" "%z_${SN}_${LINENO}"\n' -- * | 
nl -nln -w1 -s '' |
sort -k2,3 |
sed 's| ..:[^_]*||;s|-||g;s|^|mv "${|' |
SN=SHOOTNAME sh -s -- *

Hoặc có thể:

export SN=SHOOTNAME SUFX=.NEF
stat --printf='}" "%z_${SN}_$((i=i+1))${SUFX}"\n' -- *$SUFX | 
nl -nln -w1 -s '' |
sort -k2,3 |
sed 's| ..:[^_]*||;s|-||g;s|^|mv "${|' |
sh -s -- *$SUFX

Và ở đây nó được làm việc thành một hàm shell:

_batch_date_rename () ( # a big one
    ERR= # for error reporting
    export "DIR=$1" "SUFX=$2" \ # args 1,2 must be dirname and file suffix
        "NAME=${3-${ERR:?no rename string specified}}" \ # need name string
        "TIME=${4-%y}" INT=$((${INT:-25}*3)) ${NOCONFIRM+NOCONFIRM=}
        #all above vars are exported to all points below
    _path_chk () { #run once at start - fn quits if any below test fails
        [ -d "$1" ] && [ -w "$1" ] && set -- "$1"/*"$2" && [ -e "$1" ]
    } # chks for user writable dirname and resolvable $1/*$2 glob
    _print_fmt () { #shell printf now not stat - last field zero padded
        printf 'mv "${%d}" "${DIR}/%d_${NAME}_%04d${SUFX}"\n' "$@"
    }
    _print_mv () { #prints copy of mv action before attempting 
        echo '(set -x' #uses shells debug printer to show expanded vals
        printf ': ${0+%s}\n' "$@" \
            ${NOCONFIRM-'Key "ENTER" to accept or "CTRL+C" to quit'}
        echo \) #above can be disabled by declaring NOCONFIRM at invocation
    } #by default fn batches 25 mvs at a time, displays them, and confirms
    _read_loop () { #parses piped in with IFS, batches in INTerval of 25
        argc=${1-$argc} ; ${1+shift} #total globbed files - quit point
        while IFS=' -' read nl y m d na ; do #split on -
            set -- "$@" "$nl" "$y$m$d" "$((i=i+1))" #build array until
            [ "$#" -ge "$INT" ] && break #hit interval
        done ; IFS='
';      set -- $(_print_fmt "$@") && unset IFS #finalize array in _print_fmt
        _print_mv "$@" #do the debug out
        ${NOCONFIRM+:} read < /dev/tty #if $NOCONFIRM not set confirm
        printf '%s\n' "$@" #now print the actual command
        [ $((argc>i)) -eq 1 ] || echo 'exit 0' #check if quit point     
        _read_loop #if not quit repeat
    }                                                                    
    _pipeline () { #this is mostly same - no sed though
        stat -c "$TIME" -- "$@" | nl -nln -w1 -s ' ' | sort -k2,3 | {
            _read_loop $# || echo 'exit 1' #read loop stands in for sed
        } | sh -s -- "$@" #sh still evaluates on args
    } #only two calls from main function below
    _path_chk "$1" "$2" || ${ERR:?Invalid pathname parameters specified}
    _pipeline "$DIR"/*"$SUFX" #if _path_chk do _pipeline
) #that's all folks

Điều đó sử dụng shell cho một số điều tôi đang làm với các tiện ích khác. Khái niệm này giống nhau - toàn cầu một danh sách tệp, sắp xếp theo các cách khác nhau và lưu trữ thứ tự sắp xếp. Điều thực sự khác biệt về suy nghĩ này là nó thực hiện các hoạt động di chuyển theo từng khoảng thời gian, hiển thị cho người dùng những gì nó sắp làm và chờ một lời nhắc trước khi tiếp tục. Tôi đã ghi lại chính mình bằng cách sử dụng nó ở đây để bạn có thể xem phiên cuối về cách thức hoạt động của nó.


2
Trước hết, cảm ơn rất nhiều vì đã dành thời gian để đưa ra điều này và giải thích nó rất tốt. Tôi rất trân trọng điều này. Tuy nhiên, nó vượt quá mức kỹ năng của tôi, đến nỗi tôi thực sự không hiểu nhiều, ngay cả với những lời giải thích sâu sắc của bạn. Khi tôi chạy tập lệnh trên một thư mục của các tệp kiểm tra (tập lệnh nằm trong cùng thư mục), nó cho thấy nó sẽ đổi tên tất cả các tệp thành cùng một tên tệp, nó không hiển thị bất kỳ số tăng nào. Khi tôi chạy phiên bản không có tiếng vang, tất cả các tệp sẽ biến mất sau đó và tập lệnh được đổi tên thành20140707_SHOOTNAME_
Seul

@Seul? Tại sao bạn chạy nó mà không có tiếng vang? Ồ, tôi hiểu rồi, với các tập tin thử nghiệm - xin lỗi. Nó cho thấy rằng vì lý do nào đó sh của bạn không hỗ trợ $LINENO. Bạn có thể thử làm echo $LINENOkhông? Tôi không hiểu tại sao nó không được hỗ trợ - bạn đã sao chép chính xác trong dấu ngoặc kép, phải không? Chúng quan trọng. Và tôi không thể nói cho bash- vì vậy tôi không khuyên bạn nên sử dụng nó - nhưng shnên làm việc với điều này. $LINENOđược chỉ định bởi POSIX. Ngoài ra - không đặt tập lệnh trong cùng một thư mục - khác thay đổi *thành *.NEFtrong cả dòng đầu tiên và dòng cuối cùng.
mikeerv

@Seul - nếu $LINENOkhông hoạt động, điều này có thể sẽ - thử thay đổi dòng đầu tiên thành - stat --printf='}" "%z_${SN}_$((i=i+1)).NEF"\n' -- *.NEF |... và dòng cuối cùng thành ...SN=SHOOTNAME sh -s -- *.NEF
mikeerv

Cảm ơn vì đã trở lại. Tôi đã thử với sh và điều đó làm việc tốt hơn. Tuy nhiên, ba vấn đề với đoạn mã cuối cùng của bạn (sau "hoặc có thể"):
Seul

a) phần mở rộng tập tin bị mất
Seul
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.