Làm cách nào để đổi tên tất cả các tệp có ký tự và khoảng trắng đặc biệt trong một thư mục?


10

Làm cách nào tôi có thể đổi tên tất cả các tệp trong một thư mục cụ thể trong đó các tệp chứa khoảng trắng và ký tự đặc biệt ($ và @) trong tên của chúng?

Tôi đã thử renamelệnh như sau để thay thế tất cả các khoảng trắng và ký tự đặc biệt bằng dấu _:

$ ls -lrt
total 464
-rwxr-xr-x. 1 pmautoamtion pmautoamtion 471106 Jul 17 13:14 Bharti Blocked TRX Report Morning$AP@20150716.csv


$ rename -n 's/ |\$|@/_/g' *
$ ls -lrt
total 464
-rwxr-xr-x. 1 pmautoamtion pmautoamtion 471106 Jul 17 13:14 Bharti Blocked TRX Report Morning$AP@20150716.csv
$

Lệnh hoạt động nhưng sẽ không thực hiện bất kỳ thay đổi nào trong tên tệp và cũng sẽ không trả lại bất kỳ lỗi nào. Làm thế nào có thể khắc phục điều này và có những cách khác là tốt?


1
Bạn có thể đang mong đợi tập lệnh đổi tên perl (ref: manpages.ubfox.com/manpages/dapper/man1/prename.1.html ) nhưng thay vào đó, việc đổi tên của linux-linux, không hoạt động theo cùng một cách.
Jeff Schaller

Câu trả lời:


10

Các -nlá cờ là dành cho

- không hành động

Không có hành động: hiển thị những tập tin nào đã được đổi tên.

Vì vậy, đó là bình thường nếu bạn không có bất kỳ thay đổi.

Về lệnh của bạn, nó hoạt động với tôi:

$ touch "a @ test"
$ ls
a @ test
$ rename -n 's/ |\$|@/_/g' *
a @ test renamed as a___test

Có lẽ tùy thuộc vào vỏ của bạn, bạn phải thoát khỏi |

$ rename -n 's/ \|\$\|@/_/g' *

Hoặc bạn có thể sử dụng […]ký hiệu để nhóm các ký tự:

$ rename -n 's/[ @\$]/_/g' *

1
Tôi đã thử cả ba tùy chọn không có -n và nó vẫn không thay đổi tên của tệp. Tôi không đưa ra bất kỳ lỗi nào cho bất kỳ 3 loại nào được đề cập ở trên. Có thể lệnh đổi tên không hoạt động vì một số lý do. Có cách nào khác để thay đổi tất cả các tệp trong một thư mục có dấu cách hoặc $ hoặc @ trong tên của chúng không?
Ankit Vashistha

@AnkitVashistha có rename -n 's/./_/g' *đầu ra gì không?
fredtantini

Nó không cho bất cứ điều gì, không có đầu ra, không có lỗi. Nó chỉ hạ cánh trên dòng lệnh tiếp theo.
Ankit Vashistha

đổi tên cũng không hoạt động đối với tôi để thay thế (dấu cách) hoặc ':' trên Ubuntu 18.04, Bash 4.4.20 (1)
-release

7

Bạn có thể thử như thế này:

for file in ./*Block*                                       
do echo mv "$file" "${file//[ ()@$]/_}"
done

Nếu bạn hài lòng với kết quả này, hãy xóa phần echotrước mvđể thực sự đổi tên các tệp.


Một trong những giải pháp tốt nhất tôi đã trải qua, tôi đã cố gắng vì điều này quá lâu
Sushin Pv

2

tìm kiếm một kịch bản đẹp trai để loại bỏ các ký tự đặc biệt cũng như các ký tự đặc biệt của Đức, thay thế chúng bằng các ký tự phổ quát để không xóa thông tin hữu ích Tôi đã cập nhật phiên bản cuối cùng của kịch bản có một số vấn đề nhỏ dẫn đến:

#!/bin/bash

for file in ./*
do
  infile=`echo "${file:2}"|sed  \
         -e 's|"\"|"\\"|g' \
         -e 's| |\ |g' -e 's|!|\!|g' \
         -e 's|@|\@|g' -e 's|*|\*|g' \
         -e 's|&|\&|g' -e 's|]|\]|g' \
         -e 's|}|\}|g' -e 's|"|\"|g' \
         -e 's|,|\,|g' -e 's|?|\?|g' \
         -e 's|=|\=|g'  `
  outfileNOSPECIALS=`echo "${file:2}"|sed -e 's|[^A-Za-z0-9._-]|_|g'`
  outfileNOoe=`echo $outfileNOSPECIALS| sed -e 's|ö|oe|g'`
  outfileNOae=`echo $outfileNOoe| sed -e 's|ä|ae|g'`
  outfileNOue=`echo $outfileNOae| sed -e 's|ü|ue|g'`
  outfileNOOE=`echo $outfileNOue| sed -e 's|Ö|OE|g'`
  outfileNOAE=`echo $outfileNOOE| sed -e 's|Ä|AE|g'`
  outfileNOUE=`echo $outfileNOAE| sed -e 's|Ü|UE|g'`
  outfileNOss=`echo $outfileNOUE| sed -e 's|ß|ss|g'`
  outfile=${outfileNOss}
  if [ "$infile" != "${outfile}" ]
  then
        echo "filename changed for " $infile " in " $outfile
        mv "$infile" ${outfile}
  fi
done

exit

dẫn đến:

nhập mô tả hình ảnh ở đây

@don_crissti: Anh ấy đang thực hiện hokus-pokus với infile vì linux sẽ gặp vấn đề với việc xử lý các ký tự đặc biệt khi di chuyển tên tệp.


1
nhân vật đặc biệt? cái nào
don_crissti

Không gian, Tại biểu tượng, Ampersand ....
Matthias R. Wiora

Không có vấn đề gì khi di chuyển tệp có tên chứa các ký tự đặc biệt (bao gồm cả dòng mới) ... Có lẽ bạn không quen với shell (và btw, điều này không liên quan gì đến linux, đó là tính năng shell ... )
don_crissti

ừ được rồi - bạn có thể đúng
Matthias R. Wiora

1

renamelệnh không hoạt động đối với tôi vì những lý do không xác định và tôi không nhận được câu trả lời nào khác cho câu hỏi của mình, bản thân tôi đã cố gắng nỗ lực để đổi tên thành có thể. Đây có thể không phải là cách tiếp cận tốt nhất để đổi tên các tệp nhưng nó hiệu quả với tôi và đây là lý do tại sao tôi muốn đăng nó dưới dạng câu trả lời để nếu có ai khác đọc thì có thể nhận được sự giúp đỡ để thay đổi tên tệp theo cách tôi đã làm.

Bây giờ đối với tôi, tôi biết rằng tất cả các tệp sẽ có một văn bản cụ thể trong tên của chúng là từ "Chặn". Sau đây là tên tệp trước khi đổi tên được thực hiện:

anks@anks:~/anks$ ls -lrt
total 4
-rw-r--r-- 1 anks anks   0 Jul 25 14:47 Bharti TRX Block Report$AP@12Jul15.csv
-rw-r--r-- 1 anks anks   0 Jul 25 14:47 Bharti TRX Block Report$HP@12Jul15.csv
-rw-r--r-- 1 anks anks   0 Jul 25 14:47 Bharti TRX Block Report$CH@12Jul15.csv
-rw-r--r-- 1 anks anks   0 Jul 25 14:47 Bharti TRX Block Report$KK@12Jul15.csv
-rw-r--r-- 1 anks anks   0 Jul 25 14:48 Bharti TRX Block Report$UW@12Jul15.csv

Bây giờ tôi đã viết một kịch bản shell nhỏ để thực hiện điều này có thể. Sau đây là mã:

#!/bin/bash

PATH="/home/ebfijjk/anks"

# Put the old filenames in a file.
ls $PATH | grep Block >> oldValues

# Put the new names without " " or "@" or "$" in another file
cat oldValues | sed 's/\$/_/g' | sed 's/\@/_/g' | sed 's/ /_/g' >> newValues

# Create a new file with Old names and New names seperated by a #.
paste -d'#' oldValues newValues >> oldAndNew

# Read the file with both old and new names and rename them with the new names.
while IFS='#'; read oldValue newValue
do
    mv "$oldValue" "$newValue"

done < oldAndNew

rm oldValues newValues oldandNew

Và đó là nó, khi tôi chạy kịch bản, nó đổi tên tất cả các tên file có khoảng trống ( ) hoặc $hoặc @với _thay vì những nhân vật này.


bạn có thể thay thế cat foo | sed S1 | sed S2 | sed S3 >> barbằngsed -e S1 -e S2 -e S3 foo >> bar
Archemar

2
@Archemar - hoặc đơn giản sed 's/[ ()@$]/_/g'hoặcsed 'y/ ()@$/_____/'
don_crissti

Cảm ơn don_crissti và Archemar vì những bình luận và đề xuất của bạn.
Ankit Vashistha

1

Điều này chỉ cần loại bỏ các nhân vật đặc biệt từ tên tập tin

for file in *; do mv "$file" `echo $file | tr -cd '.A-Za-z0-9_-'` ; done
Námásté Egész-ség.mkv --> NmstEgsz-sg.mkv

đặt echosau ; dođể kiểm tra trước, như:

for file in *; do echo mv "$file" `echo $file | tr -cd '.A-Za-z0-9_-'` ; done

Giải pháp khác:

rename -v 's/[^a-zA-Z0-9\.\s_-]//g' *.* && rename -v 's/[\s]/_/g' *.*
Námásté Egész-ség.mkv --> Nmst_Egsz-sg.mkv

-n tùy chọn để kiểm tra trước.


0

Tôi đã tìm kiếm một giải pháp cho vấn đề này một thời gian. Tôi làm việc trên các hệ thống khép kín cũ không thể cài đặt các gói mới. Tôi không có renamelệnh. Cuối cùng tôi đã viết một kịch bản có vẻ hoạt động với tất cả các bàn phím được nhập các ký tự đặc biệt. ~@#$%^&*()-_=+[]{}\|;:",<.>?' Kịch bản sẽ đổi tên mọi tệp và thư mục trong thư mục hiện tại. Nó sẽ thay thế tất cả các nhân vật đặc biệt, ngoại trừ -_.với _nhân vật. Các outfile=dòng có thể được sửa đổi để sử dụng một nhân vật khác nhau để thay thế nếu muốn. Thay thế |_|bằng |.|để sử dụng các .nhân vật chẳng hạn.

#!/bin/bash

for file in ./*
do
  infile=`echo "${file:2}"|sed  \
         -e 's|"\"|"\\"|g' \
         -e 's| |\ |g' -e 's|!|\!|g' \
         -e 's|@|\@|g' -e 's|*|\*|g' \
         -e 's|&|\&|g' -e 's|]|\]|g' \
         -e 's|}|\}|g' -e 's|"|\"|g' \
         -e 's|,|\,|g' -e 's|?|\?|g' \
         -e 's|=|\=|g'  `
  outfile=`echo "${file:2}"|sed -e 's|[^A-Za-z0-9._-]|_|g'`
  mv "$infile" ${outfile} &
done

exit

0

Đối với tôi trên Ubuntu 18.04 LTS với bash 4.4.20 (1) - hãy giải phóng lớp lót này hoạt động tốt để xóa khoảng trắng, @ ,: # ...

Để kiểm tra (lưu ý echolệnh:

for file in ./* ; do if [[ $file == *['!'\ :@#]* ]]; then echo mv "$file" "${file//[ #()@$:]/_}"; fi; done

Để thực hiện:

for file in ./* ; do if [[ $file == *['!'\ :@#]* ]]; then echo mv "$file" "${file//[ #()@$:]/_}"; fi; 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.