ඉලක්කගත ගොනු mv සමඟ නැවත ලියන්නේ කෙසේද?


177

මට මව් නාමාවලිය වෙත යාමට අවශ්‍ය උප බහලුමක ලිපිගොනු සහ ඩර් ටොන් ගණනක් ඇත. ඉලක්කගත නාමාවලියෙහි දැනටමත් සමහර ලිපිගොනු සහ ඩිරර්ස් ඇත, ඒවා නැවත ලිවිය යුතුය. ඉලක්කය තුළ පමණක් ඇති ලිපිගොනු නොතැබිය යුතුය. මට එය කිරීමට බල කළ හැකිද mv? එය ( mv * ..) පැමිණිලි කරයි

mv: cannot move `xyz' to `../xyz': Directory not empty

මට නැති වී ඇත්තේ කුමක්ද?


3
ඔබ උත්සාහ කර mv -fතිබේද?
sakisk

මම හිතන්නේ ඇයි mv -fනිවැරදි පිළිතුරක් නැත්තේ කියලා .
CONvid19

1
EdPedroLobito: එය ක්‍රියා නොකරන නිසා? -f ලිපිගොනු නැවත ලියයි, නමුත් ඔබ ගමනාන්තයේ පවතින සහ හිස් නොමැති උප බහලුම් ගෙන යන්නේ නම් එය ක්‍රියා නොකරයි.
එරික්ෂෙෆර්

Answers:


130

ඔබ විධාන භාවිතයෙන්, ගමනාන්තය දක්වා ඔවුන් පිටපත් පසුව මූලාශ්රය මැකීමට ඇත cp -r * ..විසින් අනුගමනය rm -rf *.

ඔබට නාමාවලි භාවිතා කර ඒකාබද්ධ කළ හැකි යැයි මම නොසිතමි mv.


4
හොඳයි, ඒක මට කරන්න අවශ්‍ය වුණේ නැහැ, මොකද ඒකට සෑහෙන කාලයක් ගත වේවි ... කෙසේ වෙතත් ස්තූතියි.
එරික්ෂෙෆර්

12
mvඔබ එකම ගොනු පද්ධතියක සිටින නිසා අනුමාන වශයෙන් වේගවත්ද ? cp -lඇත්ත වශයෙන්ම ලිපිගොනු ගෙනයාමට වඩා දෘඩ සබැඳි සෑදීමට ඔබ භාවිතා කරන්නේ නම් කුමක් කළ යුතුද?
mattdm

6
ගොනු ගුණාංග (කාලරාමුව, අවසර, ආදිය) ආරක්ෂා කිරීම සඳහා ඔබ cp -aඒ වෙනුවට භාවිතා කළ යුතුය cp -r.
dotancohen

4
ගූගල් හරහා ප්‍රමාද වී මෙහි පැමිණෙන පුද්ගලයින් සඳහා, alspalswim විසින් දෙන ලද පිළිතුර, දත්ත වලට නව දෘඩ සබැඳි නිර්මාණය කිරීමෙන් සහ පැරණි සබැඳි මකා දැමීමෙන් mv හි හැසිරීම අනුකරණය කරයි. කෙටි පිළිතුර cp -rl source destination && rm -r source.
විලියම් එවරට්

77

rsyncබොහෝ විට මෙහි වඩා හොඳ විකල්පයක් වනු ඇත. එය තරම් සරල ය rsync -a subdir/ ./.

මගේ පරීක්ෂණ ගස filename: contentsආකෘතිය:

./file1:root
./file2:root
./dir/file3:dir
./dir/file4:dir
./subdir/dir/file3:subdir
./subdir/file1:subdir

ධාවනය rsync:

$ rsync -a -v subdir/ ./
sending incremental file list
./
file1
dir/
dir/file3

ලබා දෙයි:

./file1:subdir
./file2:root
./dir/file3:subdir
./dir/file4:dir
./subdir/dir/file3:subdir
./subdir/file1:subdir

පසුව, අනුකරණය කිරීමට mv, ඔබට බොහෝ විට ප්‍රභව නාමාවලිය ඉවත් කිරීමට අවශ්‍ය වනු ඇත:

$ rm -r subdir/

ලබා දීම:

./file1:subdir
./file2:parent
./dir/file3:subdir
./dir/file4:dir

මෙය වැරදියි නම්, කරුණාකර අපේක්ෂිත ප්‍රති result ලය සමඟ සමාන උදාහරණයක් (උදා: මෙම පිළිතුරේ ඉහළ සිට මගේ පරීක්ෂණ ගස භාවිතා කිරීම) ලබා දිය හැකිද?


1
rsync පිටපත්. මෙම ප්රශ්නය චලනය ගැන ය.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

1
Il ගිලස්: ස්තූතියි. මම rm -rඅවසානයේ එකතු කළේ එය මූලික වශයෙන් සමාන කිරීමටයි mv.
මයිකල්

3
ප්‍රභවය සහ ගමනාන්තය එකම ගොනු පද්ධතියක ඇති විට copy-then-delete mv ට සමාන නොවේ. mvපරමාණුක වේ, ඉනෝඩ සංඛ්‍යා සංරක්ෂණය කරයි (එබැවින් ගොනුව විවෘතව පැවතිය හැකිය), සහ පිටපතක් සෑදීමට කාලය සහ අවකාශය අවශ්‍ය නොවේ.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

5
Il ගිලස්: මට ඒක තේරෙනවා, නමුත් දැනට ප්‍රධාන පිළිතුර එයයි cp -r; rm -r. මම හිතන්නේ ඒ අර්ථයෙන් rsyncද සඳහන් කිරීම වටී.
මයිකල්

මම දැනටමත් එය cp / rm සමඟ කර ඇත්තෙමි (එය හදිසි විය). එය සැබවින්ම බොහෝ කාලයක් ගත විය. ගිලෙස් පිටපත බොහෝ ඉක්මන් වන්නට ඇත, නමුත් ඔහු ද ප්‍රමාද වැඩිය.
එරික්ෂෙෆර්

52

rsync--remove-source-filesපරාමිතිය සමඟ පිටපත් කිරීමෙන් පසුව ප්‍රභවය මකා දැමිය හැකිය . ඔබ කැමති දේ කිරීමට මෙය පහසු ක්‍රමයක් විය යුතුය.

සිට rsync man page:

        --remove-source-files   sender removes synchronized files (non-dir)

මෙය ඇත්තෙන්ම හොඳම පිළිතුරයි. cp -r; rmනිදහස් ඉඩක් නොමැති නිසා මට භාවිතා කිරීමට නොහැකි විය. ඒ වෙනුවට rsync --remove-source-filesඅවම වශයෙන් භාවිතා කළ තැටි අවකාශය දෙකම එකම ගොනු හරහා පිටපත් කිරීමෙන් වැළකී සිටියේය.
kqw

සමහර විට --link-dest to.
user1133275

26

ඔබට මෙය කළ හැකි cpඅතර rm, නමුත් විශාල දත්ත ප්‍රමාණයක් පිටපත් නොකර ඔබ (අනුමාන වශයෙන්) මාරු කිරීමෙන් වැළකී සිටීමට උත්සාහ කරයි. @mattdm මෙම කරතොත් ඔහුගේ අදහස් , සහ තවත් ප්රශ්නයක් පිළිතුරක් විවිධ විකල්ප ගැන වඩාත් සම්පූර්ණ සාකච්ඡාව ඇත.

cp -rlf source destination
rm -r source

අත්යවශ්යයෙන්ම, විධානය -lසඳහා වන විකල්පය cpනව දත්ත වලට ඒවායේ දත්ත පිටපත් කරනවාට වඩා ලිපිගොනු වලට දෘ link සම්බන්ධතා නිර්මාණය කරයි.


1
OP දැනටමත් ඔහුගේ කර්තව්‍යය සම්පූර්ණ කර ඇති බව මම දනිමි. නමුත් මෙම පිළිතුර අනාගතයේ දී මෙම ගැටලුව ඇති ඕනෑම කෙනෙකුට උපකාර කළ හැකිය.
පල්ස්විම්

මෙය ඔවුන්ට අවශ්‍ය පිළිතුරයි. මම මෙය කළේ 60GB කුඩා සයිරස් ඊමේල් ලිපිගොනු දහස් ගණනකින් වන අතර එයට ගත වූයේ තත්පර 21 ක් පමණි.
ලැබ්‍රඩෝට්

1
මෙය මා ගත් මාර්ගයයි - cp -al source destinationඅයිතිකරුගේ තොරතුරු සහ අවසරයන් ආරක්ෂා කිරීම සඳහා මම එය වෙනස් කළෙමි .
piit79

මම හිතන්නේ ඇත්ත වශයෙන්ම OP ඔබෙන් ඉල්ලා සිටි දෙය -f විකල්පය එක් කළ යුතු අතර එසේ නොමැති නම් ගොනුව තිබේ නම් එය නැවත ලියන්නේ නැත. ඔබට එය තහවුරු කළ හැකිද? නැතහොත් මම යම් වැරැද්දක් කරන්නේද?
das Keks

asdasKeks: ඇත්ත වශයෙන්ම, cpපෙරනිමියෙන් නැවත ලියයි . මෙම -fවිකල්පය rmනැවත අලුතින් පිටපත් කිරීමට උත්සාහ කිරීමට පෙර ගොනුව ඉවත් කිරීමට උත්සාහ කරයි, එය ක්‍රියාවලියට ගොනුව ලිවීම සඳහා විවෘත කළ නොහැකි නම් උපකාරී වනු ඇත, නමුත් සමහර අය ඒ වෙනුවට දෝෂයක් ඇති බව දැකීමට කැමති වේ. එය OP ට වැදගත් දැයි මම නොදනිමි, නමුත් මම -fකෙසේ හෝ මගේ පිළිතුරට ධජය එක් කළෙමි .
palswim

9

මෙන්න ලිපිගොනු යටින් /path/to/source/rootඅනුරූප මාවතට ගෙන යන පිටපතක් /path/to/destination/root.

  • නාමාවලිය ප්‍රභවයේ සහ ගමනාන්තය යන දෙකෙහිම පවතී නම්, අන්තර්ගතය චලනය කර නැවත නැවත ඒකාබද්ධ කෙරේ.
  • ගොනුවක් හෝ නාමාවලියක් ප්‍රභවයේ ඇති නමුත් ගමනාන්තය තුළ නොමැති නම්, එය ගෙන යනු ලැබේ.
  • ගමනාන්තය තුළ දැනටමත් පවතින ඕනෑම ගොනුවක් හෝ නාමාවලියක් ඉතිරි වේ. (විශේෂයෙන් ඒකාබද්ධ කරන ලද නාමාවලි ප්‍රභවයේ ඉතිරිව ඇත. මෙය නිවැරදි කිරීම පහසු නැත.)

පරිස්සම් වන්න, පරීක්ෂා නොකළ කේතය.

export dest='/path/to/destination/root'
cd /path/to/source/root
find . -type d \( -exec sh -c '[ -d "$dest/$0" ]' {} \; -o \
                  -exec sh -c 'mv "$0" "$dest/$0"' {} \; -prune \) \
    -o -exec sh -c '
        if ! [ -e "$dest/$0" ]; then
          mv -f "$0" "$dest/$0";
        fi
' {} \;

නිවැරදි කිරීම් දෙකක්: ඔබට අවශ්ය \;පෙර -oඑම පළමු රේඛාව මත findවිධාන, ඔබ පලා නොකළ යුතුය !තුළ if- ඒක තියෙන්නේ !නෑ,\!
llhuii

ක්‍රියා නොකරයි - මට ලැබෙන්නේ: mv: චලනය කළ නොහැක '.' වෙත '/ <dest> /./.': උපාංගය හෝ සම්පත් කාර්යබහුලයි. මම / a / b සිට / a දක්වා දේවල් ගෙනයාමට කැමතියි
Gerfried

ErGerfried දැනට පවතින නාමාවලි මඟහරින කේතයේ වැරැද්දක් මම නිවැරදි කළෙමි. කරුණාකර නැවත උත්සාහ කරන්න.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

3

මෙම ත්‍රෙඩ් එක වසර ගණනාවක් තිස්සේ පවතින අතර තවමත් ගූගල් හි # 1 වන ස්ථානයේ සිටින නිසා මට වෙනත් ක්‍රමයක් එක් කිරීමට අවශ්‍ය විය. මම සාමාන්‍යයෙන් මෙය කරන්නේ කෙසේද: උප බහාලුම් අන්තර්ගතය ටාර්බෝල් එකකට ඇසුරුම් කිරීම, ටාර්බෝල් මව් නාමාවලිය දක්වා ගෙනයාම සහ පෙරනිමි - ඕවර් රයිට් හැසිරීමෙන් එය උපුටා ගැනීම. මෙය ඔබ සොයන දේම කරයි. පසුව ඔබට ඔබේ උපසිරැසිය ඉවත් කළ හැකිය.

cd xyz
tar -cvzpf tmp.tar.gz *
mv tmp.tar.gz ../tmp.tar.gz
cd ..
tar -xvzpf tmp.tar.gz
rm -rf xyz
rm -f tmp.tar.gz

මෙය ක්‍රියාත්මක වන්නේ ඔබට සම්පීඩිත තාර ගොනුව සඳහා අමතර ඉඩක් ඇත්නම් පමණි. නිස්සාරණයෙන් පසු තාවකාලික තාර ගොනුව තබා ගැනීමට ඔබට ඇත්තටම අවශ්‍යද?
ඇන්තන්

1
Tmp ගොනුව ඉවත් කිරීම සඳහා කේතය සංස්කරණය කරන ලදි. වර්තමානයේ බොහෝ අවස්ථාවන්හි අවකාශය ගැටළුව නොවේ. #terabyteages
සයිමන්

0

ඔබට ප්‍රමාණවත් ගබඩා තිබේ නම් ඔබට එය පහත පරිදි කළ හැකිය:

mv -bfv directory_1/* directory_2/ # all duplicate source files/directories 
                                   # will have ~ appended to them
find -name "*~" -delete            # will recursively find and delete all files 
                                   # with ~ on the end

Of සමඟ වැදගත් ලිපිගොනු නොමැති බව තහවුරු කරගන්න, නමුත් ඒවා තිබේ නම් --suffix=whateveryouwantපෙරනිමිය වෙනුවට එකතු කළ හැකිය .

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.