예를 들어 파일 이름은 다음과 같습니다.
Order21039 Internal Document.doc
Order33920 New Order.doc
Order39307 Exam.doc
.
.
.
처음 10자를 유지하고 다음과 같은 다른 텍스트를 추가하고 싶습니다.
Order21039.test.doc
Order33920.test.doc
.
.
.
FreeBSD를 위한 가장 좋고 쉬운 방법은 무엇입니까?
답변1
그리고 zsh
:
autoload zmv # best in ~/.zshrc
zmv -n '(?(#c10))*.doc' '$1.test.doc'
(행복하면 삭제 -n
).
다음과 같이 변경할 수 있습니다.
zmv -n '(Order<->)*.doc' '$1.test.doc'
일치하는 Order<anydecimalnumber>
문자는 10개가 아닙니다.
이름을 바꾼 후 perl
:
PERL_UNICODE=LADS rename -n 's|^\./.{10}\K.*\.doc\z|.test.doc\z|s' ./*.doc
(이와는 달리 zmv
여러 파일이 동일한 파일에 매핑되는 것을 방지하지 않습니다.)
이것이 없으면 FreeBSD와 같은 POSIX와 유사한 셸을 사용할 수 있습니다 /bin/sh
.
for file in ??????????*.doc; do
newfile=${file%"${file#??????????}"}.test.doc
echo mv -i -- "$file" "$newfile"
done
(행복하면 삭제 echo
).
Bourne과 유사한 쉘의 경우:
for file in ??????????*.doc; do
newfile=`expr " $file" : ' \(.\{10\}\)'`.test.doc
echo mv -i -- "$file" "$newfile"
done
답변2
다음을 포함하는 셸의 간단한 for 루프 sed
:
for file in *
do
echo mv "$file" `echo "$file" | sed -e 's/\(.\{10\}\).*.\(.\{3\}\)/\1.test.\2/'`
done
출력에 만족하면 echo
이전 mv
.
이는 디렉터리의 모든 파일을 처리하며 3자 길이의 확장자를 가진 파일 이름과 함께 작동합니다.
답변3
여러 가지 솔루션이 있으며 그 중 일부는 운영 체제에 따라 다릅니다.
Rename multiple files, groups of files
1) rename -- Debian version and RedHat version differ, q.v.
(try package util-linux:
http://en.wikipedia.org/wiki/Util-linux)
2) ren -- RedHat relatives
3) renameutils -- package contains qmv, imv, icp, qcp, and deurlname
4) mved -- (circa 2006; good as of 2015.05), perl
http://raf.org/mved/
(An earlier shell version may be available.)
5) rename -- perl builtin library routine (DIY)
6) mmv -- move/rename/copy/append/link multiple files by wildcard patterns
7) gprename - batch rename using a GUI
8) krename - batch rename using a GUI
예를 들어, s1 파일의 다음 코드는 mved를 보여줍니다.
# Set up environment.
pl " Input data file of names $FILE:"
head $FILE
i=0
while IFS='' read -r file
do
(( i++ ))
# echo " Name $i: $file"
touch "$file"
done < $FILE
pl " Files to consider renaming:"
ls -1 *.doc
pl " Expected output:"
cat $E
# "Order21039 Internal Document.doc" -> "Order21039.test.doc"
pl " Verbose execution and file list:"
mved -v "??????????*.doc" ==========.test.doc
pe
ls -1 *.doc
생산하다:
Input data file of names data1:
Order21039 Internal Document.doc
Order33920 New Order.doc
Order39307 Exam.doc
-----
Files to consider renaming:
Order21039 Internal Document.doc
Order33920 New Order.doc
Order39307 Exam.doc
-----
Expected output:
Order21039.test.doc
Order33920.test.doc
Order39307.test.doc
-----
Verbose execution and file list:
mv Order21039 Internal Document.doc Order21039.test.doc
mv Order33920 New Order.doc Order33920.test.doc
mv Order39307 Exam.doc Order39307.test.doc
Order21039.test.doc
Order33920.test.doc
Order39307.test.doc
이러한 시스템에서는:
OS, ker|rel, machine: FreeBSD, 11.0-RELEASE-p9, amd64
bash GNU bash 4.4.12
(perl) 코드 mved의 일부 세부사항:
mved carefully rename multiple files (man)
Path : ~/bin/mved
Version : 1.4
Length : 495 lines
Type : Perl script, ASCII text executable
Shebang : #!/usr/bin/env perl
Help : probably available with -h
Home : http://raf.org/mved/ (doc)
Modules : (for perl codes)
warnings 1.23
strict 1.08
Getopt::Std 1.10
mved의 호출 시퀀스에는 첫 번째 표현식에서 와일드카드 일치의 해당 결과를 나타내는 로컬 "와일드카드" "="가 포함됩니다.
건배, drl