Cách đổi tên splitfile [az] thành splitfile [1-26]


7

Tôi cố gắng để đổi tên tập tin có tên theo hình thức splitfile[a-z]cho splitfile[1-26].csv, đó là tôi muốn đổi tên splitfileađể splitfile1.csvvà vân vân.
Tôi đã thử lệnh sau:

mv splitfile[a-z] splitfile[1-26].csv 

nhưng nó không hoạt động. Hãy giúp tôi, trong khi tôi đang cố gắng với vòng lặp.


2
Bạn có thể muốn xem xét đệm với số không hàng đầu, như thế nào splitfile01.csv. Cách bạn đề nghị, phân loại thông thường sẽ đặt chúng theo thứ tự splitfile1, splitfile10, splitfile11, ... splitfile19, splitfile2, splitfile20, ... mà thường là bất tiện. Cụ thể, làm cat splitfile*.csvsẽ không còn kết hợp chúng trở lại theo thứ tự thích hợp.
Nate Eldredge

Câu trả lời:


10

Với mới, bashbạn có thể sử dụng mở rộng dấu ngoặc của biểu mẫu {a..z}:

i=1; for f in file{a..z}; do mv "$f.csv" "${f%?}$((i++)).csv"; done

in file[a-z]cũng hoạt động nhưng chưa được sắp xếp , vì vậy nó có thể bị lừa bởi$(echo file[a-z] | sort)
Costas

Còn việc sử dụng file*thay vì file{a..z}? Tôi nghĩ nó nên hoạt động ...
Mohammad

Và xin lưu ý rằng do mv "$f.csv"nên do mv "$f"theo câu hỏi.
Mohammad

@ mohammad.k Không thể file*vì điều đó cũng phù hợp file_something_not_a_single_letter. Ngoài ra, nó phải được mv "$f.csv"thay vì mv "$f", bởi vì các file{a..z}trận đấu filea, không có hậu tố .csv.
jimmij

2
@Costas - mặc định được sắp xếp theo miền địa phương.
mikeerv

7

Nếu bạn có perltiện ích rename(đôi khi được gọi prename), bạn có thể sử dụng nó để đổi tên các tệp của mình

rename -n 's/([a-z])$/ord($1)-96/e and $_ .= ".csv"' splitfile?

Điều này làm là lấy chữ cái cuối cùng của tên tệp của bạn khớp splitfile?, chuyển đổi ký tự thành tương đương thứ tự ASCII của nó (tức là a = 97, b = 98, ...), trừ 96 và thay thế chữ cái phù hợp bằng kết quả. Đối với tất cả tên tệp nơi thay thế này được áp dụng thành công, chuỗi ".csv" được nối thêm.

Lệnh trên sẽ không thay đổi các tệp thực tế của bạn (đó là những gì -ncờ làm), nó sẽ chỉ in những gì nó sẽ làm. Chạy một lần, kiểm tra đầu ra và, nếu đúng, hãy chạy lại mà không cần -n.


4

Với zshmột người không cần sử dụng vòng lặp, chỉ cần một zmvhàm:

autoload -U zmv
i=1 zmv -v '(file)[a-z].csv' '$1$((i++)).csv'

Hoặc nếu không phải tất cả file[a-z].csvcó thể tồn tại:

letters=({a..z})
zmv -v '(file)([a-z]).csv' '$1$letters[(i)$2].csv'

1

Tập shlệnh này đổi tên chính xác các tập tin ngay cả khi các tập tin bị thiếu trong a-zchuỗi:

#!/bin/sh
for n in $(seq 26)
do
    f=$(printf $(printf 'file\%03o.csv' $((n+96))))
    [ -e $f ] && echo mv $f file$n.csv
done

0

Đây là một cách để làm điều đó với trình bao POSIX, giả sử tất cả các tệp tồn tại trong a-zchuỗi:

#!/bin/sh
i=1
for f in file[a-z].csv
do
    echo mv $f file$i.csv
    i=$((i+1))
done

2
không chính xác ... xem xét các trường hợp khớp trên a và c nhưng không phải b.
mikeerv

@mikeerv, yea, cho đến nay chỉ có perlkịch bản dường như giải thích cho điều đó.
RobertL

0

Một giải pháp khá di động ...

    eval    set "'' $(dc -e'123[1-ddP32P97<a]salax')"  ### reverse-order lowercase ascii
    while   "${2+shift}" 2>&-                          ### only iterate while we should
    do      for f   in ./*["$1"].ext                   ### glob* is fine - sorting's done
            do      [ "${f%%*\]????}" ] &&             ### *null glob* kind of
            echo    mv "$f" "${f%?.*}${?%${10+?}}$#.${f##*.}"  ### echo doesn't mv much
    done;   done                                       ### $? zero-pads to two decimals

Sau khi thực hiện setdòng trên, tôi đã tạo một bộ kiểm tra cho giải pháp này như ...

    eval '  for A   in  '"$(printf %1.s%s%1.s "$@" "" ";do for a in$@")"';
            do      echo  "$A$a" > "${A}file$a.ext";        done;   done'

Điều đó lặp đi lặp lại bỏ qua hai chữ cái cho mỗi hai chữ cái ... nếu điều đó có ý nghĩa. Kết quả là:

ls -m

bfilec.ext, bfilef.ext, bfilei.ext, bfilel.ext, bfileo.ext, bfiler.ext,
bfileu.ext, bfilex.ext, efilec.ext, efilef.ext, efilei.ext, efilel.ext,
efileo.ext, efiler.ext, efileu.ext, efilex.ext, hfilec.ext, hfilef.ext,
hfilei.ext, hfilel.ext, hfileo.ext, hfiler.ext, hfileu.ext, hfilex.ext,
kfilec.ext, kfilef.ext, kfilei.ext, kfilel.ext, kfileo.ext, kfiler.ext,
kfileu.ext, kfilex.ext, nfilec.ext, nfilef.ext, nfilei.ext, nfilel.ext,
nfileo.ext, nfiler.ext, nfileu.ext, nfilex.ext, qfilec.ext, qfilef.ext,
qfilei.ext, qfilel.ext, qfileo.ext, qfiler.ext, qfileu.ext, qfilex.ext,
tfilec.ext, tfilef.ext, tfilei.ext, tfilel.ext, tfileo.ext, tfiler.ext,
tfileu.ext, tfilex.ext, wfilec.ext, wfilef.ext, wfilei.ext, wfilel.ext,
wfileo.ext, wfiler.ext, wfileu.ext, wfilex.ext, zfilec.ext, zfilef.ext,
zfilei.ext, zfilel.ext, zfileo.ext, zfiler.ext, zfileu.ext, zfilex.ext

Và rồi tôi đã thử nó ...

while ...; do ...; done | { HOME=/dev/null; paste -d', ' - ~ - ~; }

mv ./bfilex.ext ./bfile24.ext, mv ./efilex.ext ./efile24.ext,
mv ./hfilex.ext ./hfile24.ext, mv ./kfilex.ext ./kfile24.ext,
mv ./nfilex.ext ./nfile24.ext, mv ./qfilex.ext ./qfile24.ext,
mv ./tfilex.ext ./tfile24.ext, mv ./wfilex.ext ./wfile24.ext,
mv ./zfilex.ext ./zfile24.ext, mv ./bfileu.ext ./bfile21.ext,
mv ./efileu.ext ./efile21.ext, mv ./hfileu.ext ./hfile21.ext,
mv ./kfileu.ext ./kfile21.ext, mv ./nfileu.ext ./nfile21.ext,
mv ./qfileu.ext ./qfile21.ext, mv ./tfileu.ext ./tfile21.ext,
mv ./wfileu.ext ./wfile21.ext, mv ./zfileu.ext ./zfile21.ext,
mv ./bfiler.ext ./bfile18.ext, mv ./efiler.ext ./efile18.ext,
mv ./hfiler.ext ./hfile18.ext, mv ./kfiler.ext ./kfile18.ext,
mv ./nfiler.ext ./nfile18.ext, mv ./qfiler.ext ./qfile18.ext,
mv ./tfiler.ext ./tfile18.ext, mv ./wfiler.ext ./wfile18.ext,
mv ./zfiler.ext ./zfile18.ext, mv ./bfileo.ext ./bfile15.ext,
mv ./efileo.ext ./efile15.ext, mv ./hfileo.ext ./hfile15.ext,
mv ./kfileo.ext ./kfile15.ext, mv ./nfileo.ext ./nfile15.ext,
mv ./qfileo.ext ./qfile15.ext, mv ./tfileo.ext ./tfile15.ext,
mv ./wfileo.ext ./wfile15.ext, mv ./zfileo.ext ./zfile15.ext,
mv ./bfilel.ext ./bfile12.ext, mv ./efilel.ext ./efile12.ext,
mv ./hfilel.ext ./hfile12.ext, mv ./kfilel.ext ./kfile12.ext,
mv ./nfilel.ext ./nfile12.ext, mv ./qfilel.ext ./qfile12.ext,
mv ./tfilel.ext ./tfile12.ext, mv ./wfilel.ext ./wfile12.ext,
mv ./zfilel.ext ./zfile12.ext, mv ./bfilei.ext ./bfile09.ext,
mv ./efilei.ext ./efile09.ext, mv ./hfilei.ext ./hfile09.ext,
mv ./kfilei.ext ./kfile09.ext, mv ./nfilei.ext ./nfile09.ext,
mv ./qfilei.ext ./qfile09.ext, mv ./tfilei.ext ./tfile09.ext,
mv ./wfilei.ext ./wfile09.ext, mv ./zfilei.ext ./zfile09.ext,
mv ./bfilef.ext ./bfile06.ext, mv ./efilef.ext ./efile06.ext,
mv ./hfilef.ext ./hfile06.ext, mv ./kfilef.ext ./kfile06.ext,
mv ./nfilef.ext ./nfile06.ext, mv ./qfilef.ext ./qfile06.ext,
mv ./tfilef.ext ./tfile06.ext, mv ./wfilef.ext ./wfile06.ext,
mv ./zfilef.ext ./zfile06.ext, mv ./bfilec.ext ./bfile03.ext,
mv ./efilec.ext ./efile03.ext, mv ./hfilec.ext ./hfile03.ext,
mv ./kfilec.ext ./kfile03.ext, mv ./nfilec.ext ./nfile03.ext,
mv ./qfilec.ext ./qfile03.ext, mv ./tfilec.ext ./tfile03.ext,
mv ./wfilec.ext ./wfile03.ext, mv ./zfilec.ext ./zfile03.ext,

0

Đây là một đề xuất thay thế, không hỗ trợ các tệp bị thiếu, nhưng tôi cảm thấy cần phải thử một giải pháp "chức năng" hơn hoạt động trên các bộ dữ liệu:

#!/bin/bash
splitfile_renamer() {
  mv splitfile$1 splitfile$2.csv
}

paste <(echo -en {a..z}"\n") <(seq 26) | while read args
  do splitfile_renamer $args
done

Ở trên sử dụng pasteđể tạo các bộ đối số (được phân tách bằng khoảng trắng) và chuyển chúng đến một hàm được tạo sẵn, sau đó đưa chúng vào dưới dạng đối số được đánh số.

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.