බහු ගොනු වල දිගුව වෙනස් කරන්නේ කෙසේද?


195

මම සිට ගොනු දිගුව වෙනස් කිරීමට කැමති *.txtකිරීමට *.text. මම basenameවිධානය භාවිතා කිරීමට උත්සාහ කළෙමි , නමුත් එක් ගොනුවකට වඩා වෙනස් කිරීමට මට අපහසුතාවයක් ඇත.

මෙන්න මගේ කේතය:

files=`ls -1 *.txt`

for x in $files
do
    mv $x "`basename $files .txt`.text"
done

මට මෙම දෝෂය ඇතිවේ:

basename: too many arguments Try basename --help' for more information

සමහර අදහස් peteryu.ca/tutorials/shellscripting/batch_rename
Nemo

Answers:


217

ග්‍රෙග්ගේ විකියෙන් කෙළින්ම :

# සියල්ල * .txt සිට * .text දක්වා නම් කරන්න
f සඳහා * .txt; කරන්න
    mv - "$ f" "$ {f% .txt} .text"
ඉවරයි

ඔබ විග්‍රහ නොකළ යුත්තේls මන්ද යන්න පිළිබඳ සටහන ද බලන්න .

සංස්කරණය කරන්න: ඔබට භාවිතා කිරීමට අවශ්‍ය නම් basename, ඔබේ වාක්‍ය ඛණ්ඩය වනුයේ:

f සඳහා * .txt; කරන්න
    mv - "$ f" "$ (basename -" $ f ".txt) .text"
ඉවරයි

64
පැහැදිලි කිරීමකින් තොරව මෙහි තරමක් දියුණු Bash සින්ටැක්ස් භාවිතා කර ඇත. මෙය සම්පූර්ණයෙන් වටහා ගැනීම සඳහා මට ගූගල් වෙත බොහෝ දේ කිරීමට සිදුවිය. මගේ තනතුරේ සිටින අනෙක් අයට උපකාර කිරීම සඳහා, ග්ලෝබ්ස් ( *.txtසින්ටැක්ස්) , හිස් ඩබල් ඩෑෂ්-- සහ ඉදිකිරීම් තුළ% සංකේතය භාවිතා කිරීම${} පිළිබඳ සඳහනක් මෙහි දැක්වේ . මේ වන තෙක් මට දෙවැන්න කවදාවත් හමු නොවූ අතර කලින් සිදුවූයේ කුමක්දැයි දැන සිටියේ නැත.
අමරි

4
මතියස් බ්‍රවුන්ගේ පිළිතුර පහතින් බලන්න - වඩා සරල, එකම දේ ඉටු කරයි.
btk

22
එක් ලයිනර්for f in *.txt; do mv -- "$f" "${f%.txt}.text"; done
මාරියාල් ජුවාන්

2
Line දෙවන පේළියේ PéturIngiEgilsson? නැත, එය අවශ්‍ය නොවේ.
jasonwryan

3
වෙන්නේ මොනවාද --සඳහා එල්ලවී?
කැල්කියුලස්

160

මෙන්න මම ඩේබියන් හි වත්මන් නාමාවලියෙහි ඇති සියලුම ගොනු දිගු වෙනස් කරන්නේ කෙසේද.

rename "s/oldExtension/newExtension/" *.txt

(මෙය පර්ල් renameවිධානය මිස util-linuxඑකක් නොවේ . බලන්න ඩෙබියන් / උබුන්ටු වල නම් කිරීමේ උපයෝගීතාව සෙන්ටෝස් වැනි අනෙකුත් බෙදාහැරීම් වලට වඩා වෙනස් වන්නේ ඇයි? )


11
පිළිගත් පිළිතුරට වඩා සරලයි, ස්තූතියි!
btk

12
මැක්හි මට මෙය ක්‍රියාත්මක කිරීමට හැකි විය brew install rename.
මොන්ක්පිට්

3
මාළු කවචයකින් ඔබට rename "s/oldExtension/newExtension/" **.txtසියල්ල නැවත නම් කිරීමට කළ හැකිය * .txt පුනරාවර්තනය
Matěj Šmíd

4
මෙය අසාර්ථක වනු ඇත footxt.txt. ඒ වෙනුවට මෙය භාවිතා කරන්න: unix.stackexchange.com/questions/19654/…
wisbucky

7
ඔබගේ ලිපිගොනු වල කිසිදු දිගුවක් නොමැති විට ඔබට එකක් එකතු කිරීමට අවශ්‍ය විට:rename 's/$/.txt/' *
mkataja

43

සරල විධානයක්, renameසිටutil-linux , ඔබ වෙනුවෙන් එය කරනු ඇත, එය "txt" හි සෑම සිදුවීමක්ම "* .txt" ගැලපෙන සියලුම ලිපිගොනු වල "පෙළ" ලෙස ප්‍රතිස්ථාපනය කරයි:

rename txt text *.txt

4
renameපළමු සිදුවීම වෙනස් කරයි, එය වඩා හොඳ කරන්න rename .txt .text, නමුත් මෙය තවමත් ක්‍රියා නොකරනු ඇත (උදා: එය නැවත නම් foo.txtx.bar.txtකරයි foo.textx.bar.txt).
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

16
සෑම පද්ධතියකම එකම නම වෙනස් කිරීමේ අනුවාදයක් නොමැති බව සැලකිල්ලට ගත යුතුය. ඩේබියන් සහ මිතුරන් මත, renameවිධානය ඇත්ත වශයෙන්ම වන perl-renameඅතර perl regexes භාවිතා කරයි. ඒ සඳහා සමාන විධානය වනුයේ : rename 's/.txt/.text/' *.txt. මිනිසුන් සතුව man renameඇත්තේ කවරේදැයි සොයා ගැනීමට ඔවුන්ගේ පද්ධතිය පරීක්ෂා කළ යුතුය .
evilsoup

@evilsoup OSX, thx
ඩේවි ලීමා

මෙය සිග්වින් (වින්ඩෝස්) මතද ක්‍රියාත්මක වේ
andy

31
rename "s/oldExtension/newExtension/" *.txt

ඉහත ක්‍රියා කරන්නේ හොඳින් නමුත් වර්තමාන නාමාවලියට පමණක් සීමා වේ. උප බහලුම් සමඟ නම්‍යශීලී වන පහත විධානය උත්සාහ කරන්න. එය .txtනාමාවලි ව්‍යුහය යටතේ ඇති සියලුම ගොනු නව දිගුවක් සමඟ නැවත නම් කරනු ඇත .

find . -name "*.txt" -exec rename 's/.txt$/.newext/' {} \;

2
renameබහුවිධ ලිපිගොනු තර්කයක් ලෙස හැසිරවිය හැකි අතර, එවැනි ගොනු බොහොමයක් තිබේ නම් +ඒ වෙනුවට භාවිතා කිරීමෙන් ඔබට බොහෝ දේ වේගවත් කළ හැකිය\;
ඇන්තන්

තවමත්, එය ප්‍රයෝජනවත් විකල්පයක් වන බැවින් "* .txt" මඟින් කවචයට සහාය නොදක්වන විශාල තර්ක ලැයිස්තුවකට ඇතුළත් කළ හැකිය.
රෝමානු ෂාපොලොව්

1
"s / oldExtension / newExtension /" සඳහා අසමත් වේ footxt.txt. ඒ වෙනුවට මෙය භාවිතා කරන්න: unix.stackexchange.com/questions/19654/…
wisbucky

12

මෙහි සඳහන් පිළිතුරු s/oldExtension/newExtension/වැරදිය. ඔබ භාවිතා කරන්නේ නම් s/txt/text/, ඔබ පරිවර්තනය footxt.txtකරනු ඇත footext.txt, එය ඔබට අවශ්‍ය දේ නොවේ. ඔබ භාවිතා කළත් s/.txt/.text/, එය පරිවර්තනය footxt.txtවේ fo.text.txt.

\.කාල පරිච්ඡේදය ගැලපීමට ඔබ භාවිතා කළ යුතුය ( .ඕනෑම අක්ෂරයකට ගැලපේ). $රේඛාවේ අවසානයට ගැලපෙන පරිදි පසුපස යාම. දිගුව නිසි ලෙස ගැලපෙන්නේ මෙය පමණි.

rename 's/\.txt$/.text/' *.txt

rename 's/\.old$/.new/' *.old


8

මෙම @Prince ජෝන් වෙස්ලි පිළිතුර මත පදනම්ව, මෙහි සිට වත්මන් සියළුම ගොනු සියළු දිගු වෙනස් කිරීම සඳහා සරල bash තිර රචනය ext1කිරීමට ext2. නැවත නම් කරන ලද ලිපිගොනු වල නම් ද ප්‍රතිදානය කරයි.

#!/bin/bash
for f in *.$1
do
    [ -f "$f" ] && mv -v "$f" "${f%$1}$2"
done

උදාහරණ භාවිතය (ස්ක්‍රිප්ටයේ නම උපකල්පනය කරමින් change-ext):

change-ext ext1 ext2

නාමාවලිවල ගොනු දිගුවන් පුනරාවර්තව වෙනස් කිරීමට, දෙවන පේළිය ( for...) පේළි දෙකකින් ආදේශ කරන්න : shopt -s globstarසහ for f in **/*.$1. Bash 4+ අවශ්‍යයි.
ඩෙනිස් ගොලොමසොව්


6

ඔබගේ ලිපිගොනු විවිධ නාමාවලිවල විසිරී ඇති බව කියමු, ඩිරෙක්ස් ඔබේ මව් නාමාවලිය යැයි උපකල්පනය කරමින්, මෙය සොයා ගැනීම භාවිතා කරමින් කාර්යය කළ හැකිය:

for f in `find /dirx -iname '*.txt' -type f -print`;do  mv "$f" ${f%.txt}.text; done

Tcsh ගැන කුමක් කිව හැකිද ..
ජොසෙෆ් ක්ලිමුක්

3

ඔබ සිටින විට

ප්‍රභව ගොනු සඳහා දිගුවක් නොමැත

ඉලක්ක දිගුව වේ .අපි ඔබ එය කරන්නේ මේ ආකාරයටයි -

for f in *; do mv -- "$f" "${f%.\*}.text"; done

1
විශිෂ්ට බාෂ්-ස්වදේශීය පිටපත. නියමයි! for f in *.html; do mv -- "$f" "${f%.\*}.pug"; done
TamusJRoyce

2

මෙය මට ප්‍රයෝජනවත් වන්නේ:

find . -name '*.txt' -exec rename 's/\.txt$/.text/' \{} \;

1
කරුණාකර a එකතු කරන්න. "පෙළ" ට පෙර
danielmhanover

1

ඔබේ අනුවාදයේ වැරැද්ද කුමක්දැයි දැන ගැනීමට ඔබට අවශ්‍ය නම්: ඔබ භාවිතා කළේ මූලික නාම විධානය $filesවෙනුවට ය $x. එබැවින් මෙය ක්‍රියාත්මක විය යුතුය (පරීක්ෂා නොකළ නමුත්):

for x in *.txt
do
  mv "$x" "`basename '$x' .txt`.text"
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.