Tập lệnh hoặc chương trình Linux để rút ngắn tên tập tin


8

Tôi đã không thành công trong việc tìm kiếm một phiên bản Linux của namemangler , mà tôi cần đổi tên 1000 tệp để chúng có thể đọc được trên Windows.

Có ai biết một chương trình Linux có thể làm điều này không?

Nếu không, thì một tập lệnh có thể hoạt động vì tôi chỉ cần đổi tên tất cả các tệp trong một thư mục thành 16 ký tự đầu tiên. Tôi nghi ngờ rằng tuyến đường kịch bản có thể đáng để đi xuống nhưng không biết bắt đầu từ đâu.


2
Bạn có thể có thể viết nhanh một tập lệnh Python hoặc Perl hoặc Ocaml hoặc Ruby làm điều đó.

Tại sao bạn không thể sử dụng hệ thống tệp vfat, cho phép tên tệp dài?
wnoise

2
Vì tò mò, tên bao lâu và chúng chứa những gì mà chúng không được Windows nhận ra?
Bobby

Câu trả lời:


10

Trên Debian, Ubuntu và các công cụ phái sinh, nếu bạn nhập man renametại dấu nhắc lệnh, bạn sẽ nhận được trang thủ công cho một tiện ích đổi tên cho phép sử dụng các lệnh biểu thức chính quy giống như Perl tùy ý trong việc đổi tên.

Ví dụ: điều này sẽ rút ngắn (bằng cách cắt bớt) tất cả các tệp trong thư mục hiện tại xuống còn năm:

rename 's/^(.{5}).*/$1/' *

Nó hoạt động bằng cách bắt năm ký tự đầu tiên sau đó sử dụng thay thế, loại bỏ phần còn lại.

Một ví dụ khác là rút ngắn tên tệp (phần mở rộng sans) thành năm ký tự sẽ giữ nguyên phần mở rộng:

rename 's/^(.{5}).*(\..*)$/$1$2/' *

Nó bắt được hai nhóm, nhóm đầu tiên là năm nhân vật đầu tiên, nhóm thứ hai là phần mở rộng. Điều này sẽ biến myCarefullyCraftedDocument.pdfthành myCar.pdf.

Cảnh báo: Sử dụng cẩn thận, tốt nhất là trên một bản sao của thư mục của bạn hoặc bằng cách sao lưu trước. Bạn đã được cảnh báo!! Ở mức tối thiểu, sử dụng rename -nđầu tiên, nó sẽ cho bạn thấy những gì sẽ được thực hiện mà không thực sự làm điều đó.


1
điều này sẽ thoát khỏi tiền tố như trong PDF? và điều gì sẽ xảy ra với các tệp có cùng tên một khi rút ngắn?

Đó là ví dụ cụ thể, vâng. Bạn có thể viết một regex để lại phần mở rộng một mình. Tôi sẽ cập nhật câu trả lời. Nó cũng bảo vệ chống lại các tập tin ghi đè đã tồn tại, vì vậy việc đổi tên sau này sẽ thất bại.

cảm ơn sự giúp đỡ của bạn về điều này - tôi rất biết ơn. Tôi có một vấn đề nhỏ nếu một số pdf sẽ được đổi tên thành 5 cho phép điều gì sẽ xảy ra với PDF. Nó cố gắng đổi tên với cùng tên? Đây có phải là cách chúng ta có thể thêm một số duy nhất vào tất cả những số này không? xem dưới đây ename -n 's / ^ * (\ .. *) $ / $ 1 $ 2 / ({5}.).' * Phụ lục 123114345234525.pdf đổi tên thành Annex.pdf Phụ lục 123114432452352.pdf đổi tên thành Annex.pdf

@Grimlockz, tôi không nghĩ bạn có thể đưa loại trí thông minh đó vào chính regex đổi tên. Những gì bạn có thể cần làm là viết một kịch bản để đổi tên với loại trí thông minh đó và đó là câu hỏi riêng biệt để bạn nhận được nhiều người trả lời hơn là tôi

@Grimlockz Đây là lý do tại sao bạn không muốn làm mọi thứ trong một regex. Bạn sẽ hạnh phúc hơn và tốt hơn hết là viết một kịch bản sử dụng biểu thức chính quy.
Spencer Rathbun

3

Bạn có thể di chuyển các tệp bị xung đột sang thư mục khác:

for i in *
do
    j=${i:0:16}

    if [ -e "$j" ]
    then
        mv "$i" /path/to/rename/later
    else
        mv "$i" "$j"
    fi
done

1

Bạn có thể viết một tập lệnh để rút ngắn tên tệp và xóa các ký tự mà Windows không thích trong một vài dòng bash. Cảnh báo, mã chưa được kiểm tra, nhập trực tiếp vào trình duyệt của tôi.

shopt -s dotglob extglob
for x in *; do
  y=${x//+([!-!#$%&'().0-9@A-Z^_`a-z{}~])/_}  # change all problematic characters to _
  if [[ $y = .* ]]; then y=_${y#.}; fi        # change dot files to begin with _
  y=${y:0:16}                                 # truncate names
  y=${y,,}                                    # convert to lowercase
  if [[ -e $y || $y =~ ^(aux|clock\$|com[0-9]|con|lpt[0-9]|nul|prn)(\.*)?$ ]]; then
    # The file exists or is a DOS/Windows reserved name.
    # Change foo.bar to foo~1.bar, foo~2.bar, ... (I ignore the length restriction here)
    i=1
    if [[ $y =~ \. ]]; then
      prefix=${y%%.*}; suffix=.${y#*.}
    else
      prefix=$y; suffix=
    fi
    y=${prefix}~$i$suffix
    while [[ -e $y ]]; do
      ((++i))
      y=${prefix}~$i$suffix
    done
  fi
  mv -- "$x" "$y"
done

Nếu bạn cần lặp lại vào các thư mục con, hãy gọi một tập lệnh shell từ find -depth -exec …. Hoặc sử dụng zsh thay vì bash; trong zsh, **/*(od)mở rộng ra tất cả các tệp trong thư mục hiện tại, theo cách đệ quy, với các tệp được lồng sâu hơn trước.


1

Shell / python / perl scripting cho loại điều này là tốt, nhưng có vẻ như một ứng dụng gui sẽ là tốt nhất cho bạn, vì vậy tôi muốn giới thiệu pyRenamer , có thể làm chính xác những gì bạn muốn, trong số nhiều thứ khác (các thao tác phổ biến đơn giản thông qua các cài đặt trước [loại bỏ khoảng trắng, cắt bớt tên tệp từ điểm này sang điểm khác], tìm kiếm / thay thế đơn giản, biểu thức chính phức tạp, trình xem trước, v.v.).

Phân phối của bạn thậm chí có thể có nó trong kho phần mềm của họ (Fedora hiện).


0

Một số hệ thống không có renamelệnh, vì vậy thay thế cho câu trả lời của paxdiablo, đây là cách thực hiện điều tương tự mv.

for f in *.pdf; do 
    tmp=`echo $f | sed -r 's//^(.{5}).*(\..*)$/$1$2/'`
    mv -b ./"$f" ./"$tmp"
done

Các -bcờ trên di chuyển tạo ra một bản sao lưu các tập tin đó sẽ bị xóa hoặc ghi đè. Bằng cách thay đổi mẫu hình cầu trong vòng lặp for, bạn có thể điều chỉnh các tệp mà nó chạy trên đó, sử dụng *chính nó để chạy trên tất cả các tệp.


1
Không cần sử dụng echovà một đường ống (có thể rất tốn kém nếu bạn có nhiều tệp), thay vào đó hãy sử dụng một di sản hoặc di truyền.
Chris Down

1
@ChrisDown xem tại đây . Theo bài viết wiki , các quy trình đường ống được chia rẽ, nhưng nó không nói gì về việc chạy chúng trong vỏ của chính chúng.
Spencer Rathbun

1
Ví dụ, chú ý sự khác biệt giữa eval 'echo $BASH_SUBSHELL'eval 'echo $BASH_SUBSHELL' | cat.
Chris Down

2
Tôi vừa thực hiện một bài kiểm tra nhanh, timesử dụng một vòng lặp bằng cách sử dụng echo $i | sedvà sử dụng một vòng lặp khác sed ... <<<$i, và việc di chuyển mất khoảng 2/3 thời gian của tiếng vang.
Kevin

1
@SpencerRathbun Có. <<bắt đầu ở đây <i> doc </ i>, đây là dòng đa dòng và yêu cầu dấu phân cách. <<<tạo một <i> chuỗi </ i> ở đây, chỉ cần một biến / chuỗi. Hãy thử nó var=abc // cat<<<$var // cat <<$var.
Kevin

0

Nếu bạn cần thử nghiệm đổi tên tệp và cài đặt thư viện KDE trên hệ thống của bạn (hoặc không phiền khi thêm chúng), hãy kiểm tra krename.

Nó cho phép bạn thực hiện khá nhiều nhiệm vụ đổi tên đơn giản trực tiếp bằng các công cụ của nó và cũng cho phép các biểu thức thông thường cho các tình huống phức tạp hơn.

Nó hiển thị cho bạn bản xem trước của các tệp được đổi tên khi bạn xây dựng các điều kiện đổi tên. Nó cũng cho phép bạn đổi tên các tệp tương tự một lần nữa, điều này rất hữu ích nếu bạn muốn làm điều gì đó phức tạp khi thực hiện nó trong các giai đoạn sẽ làm giảm độ phức tạp của từng giai đoạn thành một thứ bạn có thể tìm ra nhanh chóng.


-1
for file in *; do
    mv "$file" $(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g')
done &
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.