처음 10자를 변경하지 않고 파일 이름을 바꿉니다.

처음 10자를 변경하지 않고 파일 이름을 바꿉니다.

예를 들어 파일 이름은 다음과 같습니다.

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

관련 정보