එක් ගොනුවක් හැර අනෙකුත් සියලුම ගොනු / නාමාවලි ඉවත් කරන්න


277

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

අනවශ්‍ය ඒවා තනි තනිව ඉවත් කිරීමට තරම් ලිපිගොනු ඇති අතර ඒවායේ නම් මෙම ගොනුව හැර අනෙක් සියල්ල ඉවත් කිරීමට භාවිතා කිරීමට තරම් විවිධ වේ.

කවුරුහරි භාවිතා කිරීමට යෝජනා කළා

rm !(file.txt)

නමුත් එය ක්‍රියාත්මක නොවේ. එය නැවත පැමිණේ:

Badly placed ()'s 

මගේ මෙහෙයුම් පද්ධතිය විද්‍යාත්මක ලිනක්ස් 6 වේ.

අදහස් තිබේද?


17
ඔබට තබා ගැනීමට අවශ්‍ය එක ගෙනයන්න, ඉන්පසු අනෙක් ඒවා rm කරන්න?
ඔලිවියර් ඩුලැක්

5
LOlivierDulac මෙම ප්‍රශ්නයේ අධිතක්සේරු නොකරන එකම පුද්ගලයන් දෙදෙනා අපද?
ෂදූර්

2
ෂදූර්: හොඳයි, මට ඔවුන් හා සම්බන්ධ විය හැකිය: ඔනෙලීනර්ස් ආකර්ශනීයයි ... ^^
ඔලිවියර් ඩුලැක්

2
ස්තූතියි, ඔව් මම එක පේළියේ විසඳුමක් සොයමින් සිටියෙමි. මට මෙය නිතර නිතර කළ යුතු බැවින් ලිපිගොනු එහා මෙහා ගෙනයාමට බොහෝ කාලයක් ගත වේ.
කන්තුර

Answers:


325

POSIXly:

find . ! -name 'file.txt' -type f -exec rm -f {} +

හැර සෙසු සියලුම සාමාන්‍ය ගොනු (පුනරාවර්තන ලෙස, සැඟවුණු ඒවා ඇතුළුව) ඉවත් කරනු ඇත file.txt. නාමාවලි ඉවත් කිරීමට, වෙත වෙනස් -type fකර විකල්පය -type dඑක් කරන්න .-rrm

දී bashභාවිතා කිරීමට, rm -- !(file.txt)ඔබ කළ යුතු extglob හැකියාව :

$ shopt -s extglob 
$ rm -- !(file.txt)

(හෝ ඇමතීම bash -O extglob)

කෝර්න් ෂෙල් පවුල extglobතුළ පමණක් ක්‍රියාත්මක වන බව සලකන්න bash. භාවිතා rm -- !(file.txt)කිරීම Argument list too longදෝෂයක් ඇති කළ හැකිය .

දී zsh, විස්තාරිත ග්ලෝබ් සක්‍රීය කර ඇති ^රටාව ප්‍රතික්ෂේප කිරීමට ඔබට භාවිතා කළ හැකිය :

$ setopt extendedglob
$ rm -- ^file.txt

හෝ එම කාරක රීති භාවිතා kshසහ bashවිකල්ප සමග ksh_globසහ no_bare_glob_qualසක්රීය.


11
නාමාවලිය නියම කිරීම හොඳ පුරුද්දකි (මෙම නඩුවේ පූර්ණ මාර්ගයද? නැතහොත් මෙම විධානය වත්මන් වැඩ කරන නාමාවලියෙන් ආරම්භ වන සෑම ගොනුවක්ම මකා දමන බවට අනතුරු ඇඟවීමක් එක් කරන්න .). මම ද සාමාන්යයෙන් ඕනෑම උදාහරණයක් ලියන්න rmලෙස echo rm, ඒ වෙනුවට, ඔවුන් ඇත්තටම විශ්වාසද එය ඔවුන්ට අවශ්ය දේ කරන්නේ විට පමණක් සුප්රසිද්ධ echo විධානය පිටතට ගැනීමට ජනතාවට කියනවා. ඒ හැර, සම්පූර්ණ පිළිතුර සඳහා +1
ඔලිවියර් ඩුලැක්

13
මතක තබා ගැනීමට කෙටි හා පහසු -deleteවෙනුවට මම යෝජනා කරමි-exec
ඉස්කාටා

7
ZIzkata: -deletePOSIX විසින් අර්ථ දක්වා නැත.
cuonglm

5
ලිපිගොනු ලැයිස්තුව බැහැර කරන්නේ කෙසේද?
මීසම්

5
@ මයිසම් - ලිපිගොනු ලැයිස්තුවක් හසුරුවන විසඳුමක් සඳහා මගේ පිළිතුර බලන්න. Gnouc ගේ findවිසඳුම සමඟ ඔබට වෙනත් දේ කළ හැකිය ! \( -name one_file -o -name two_file \).
mikeserv

125

තවත් එකක් වෙනත් දිශාවකට යොමු කරයි (ගොනු නම් වල ඉඩක් නොමැති නම්)

ls | grep -v file.txt | xargs rm

හෝ (ගොනු නාමවල ඉඩ තිබුණත් ක්‍රියා කරයි)

ls | grep -v file.txt | parallel rm

සිට man grep:

 -v, --invert-match
          Invert the sense of matching, to select non-matching lines.  (-v is specified by POSIX)

2
ගොනු නාමයන්ට ඉඩක් ඇත්නම් එය ක්‍රියා නොකරනු ඇත ...
Matteo

1
Ciao atMatteo, එය අවකාශයන් සහිත ලිපිගොනු සඳහාද ක්‍රියා කරයි, නමුත් ඔබට උපුටා දැක්වීම් අනුව grep-pattern වට කළ යුතුය, උදා ls | grep -v "a file with spaces.bin" | xargs rm. මෙය සාමාන්‍ය grepවාක්‍ය ඛණ්ඩයකි.
සෙබස්තියන්

1
@Sebastian ගැටලුව නොවේ grepනමුත් rm. rmඅවකාශයෙන් වෙන් කළ තර්ක ලැයිස්තුවක් ලැබෙනු ඇත. උත්සාහ කරන්න touch 'a b'; touch 'c d'; ls | grep -v 'a b' | xargs rm: ඔබට ලැබෙනු ඇත rm: c: No such file or directoryහාrm: d: No such file or directory
මාටෙයෝ

2
එය අවකාශයන් පමණක් නොව, සියල්ලම හිස් හා නව රේඛා පමණක් නොව, අක්ෂර (තනි, ද්විත්ව උපුටා දැක්වීම් සහ බැක්ස්ලෑෂ්) සහ ගොනු නාමයන් උපුටා දක්වයි -.
ස්ටෙෆාන් චසෙලාස්

6
මෙය මට වැඩ කළා ls -Q | grep -v file.txt | xargs rm -fr. -Q ස්විචය යනු "ඇතුලත් කිරීමේ නාමයන් ද්විත්ව මිල ගණන් වලින් ඇතුලත් කරන්න"
කුසින්

35

පිටපතක් පවත්වා ගන්න, සියල්ල මකා දමන්න, පිටපත යථා තත්වයට පත් කරන්න:

{   rm -rf *
    tar -x
} <<TAR
$(tar -c $one_file)
TAR

එක් පේළියක:

{ rm -rf *; tar -x; } <<< $(tar -c $one_file)

නමුත් ඒ සඳහා මෙහි නූල් සඳහා සහාය වන කවචයක් අවශ්‍ය වේ.


11
මෙය තරමක් සිතට කාවදින සුළුය.
vschum

2
E ඩෙරෙක් - කරුණාකර සංස්කරණය බලන්න.
mikeserv

2
නමුත් මෙය අඩක් බාධා කළහොත් හෝ වෙනත් දෙයක් වැරදුනහොත් ගොනුව අතුරුදහන් වේ.
kasperd

2
askasperd - නැත. එකම කාලය අතර මව් ෂෙල් මියයයි නම් එය දිවෙන rmහා tar -x. rmඑයට අවශ්‍ය තරම් අසමත් විය හැකිය.
mikeserv

3
E ඩෙරෙක් - ඇත්තෙන්ම එය එතරම් පිස්සු නොවේ. POSIX ට අවශ්‍ය වන්නේ කවචයක් එහි ආදානය මෙහි ලේඛනයක් හමු වූ විට ඔබ නියම කළ විධානය වෙත හරවා යැවීමයි. වෙනත් දෙයක් සිදුවීමට පෙර විධාන ආදේශනය සම්පූර්ණ කළ යුතුය. බොහෝ කවච මෙහි-ලියකියවිලි සඳහා තාවකාලික ගොනු භාවිතා කරයි - සමහර පයිප්ප. කෙසේ හෝ tar -cසම්පූර්ණ වන අතර rmධාවනය වීමට පෙර කවචය එහි ප්‍රතිදානය රඳවා තබා ගනී . මන්ද යත්, අවසන් වූ විට එහි වම් එල්ලීම rmනොසලකා හරින stdinඅතර - ඔබේ ගොනුවේ (ගොනුවලින්) සුරකින ලද පිටපත ෂෙල් එකෙන් බැහැර කළ හැකිය. මෙහි දී ඩොක්ස් බොහෝ වේලාවක් ඉලක්කගත පයිප්ප මෙන් භාවිතා කළ හැකිය. tar -xrm
mikeserv

26

ඔබ සැවොම මෙය අධිතක්සේරු කරයි.

cd ..
mv fulldir/file.txt /tmp/
rm -rf fulldir
mkdir fulldir
mv /tmp/file.txt fulldir/

සිදු විය.

සංස්කරණය කරන්න , පහසු:

cd ..
ln fulldir/file.txt ./
rm -rf fulldir
mkdir -p fulldir
mv file.txt fulldir/

3
මගේ පිළිතුරත් එයමයි. Exce [pt එයට කිසිදු අවසරයක් අහිමි නොවේ.
mikeserv

7
එය වෙනම ගොනු පද්ධතියක / tmp වෙතින් විශාල ගොනුවක් නම් සහ ඔබ ගොනු පද්ධතියේ මුල සිට සියල්ල ඉවත් කිරීමට උත්සාහ කරන්නේ නම්, එය ආරක්ෂිත තැනකට ගෙනයාම විකල්පයක් නොවනු ඇත.
ජොනී

1
මෙය අනිවාර්යයෙන්ම සරලම පිළිතුරයි.
බෙන් ලියනගේ

19

මගේ විද්‍යාත්මක ලිනක්ස් 6 මෙහෙයුම් පද්ධතියේ මෙය ක්‍රියාත්මක වේ:

shopt -s extglob
rm !(file.txt)

අතථ්‍ය යන්ත්‍රයක ඩෙබියන් 32 බිට් ස්ථාපනය කර ඇත. ඉහත සඳහන් දෑ ක්‍රියාත්මක නොවන නමුත් පහත දැක්වෙන්නේ:

find . -type f ! -name 'file.txt' -delete

1
ඔබ අදහස් කළේ findමා දුන් විසඳුම සාර්ථක නොවූ බවයි?
cuonglm

"වැඩ කළේ නැත" හෝ "වැඩ කරන්නේ නැත". ඔව් ඔබේ සොයා ගැනීමේ විසඳුම ද ක්‍රියාත්මක වේ. ස්තූතියි.
කන්තුර

1
ඔබට එය වැඩි විස්තර කළ හැකිද? "ක්‍රියා නොකළේ කෙසේද? එය වෙනත් ලිපිගොනු ඉවත් නොකරයි, නැතහොත් එය ඉවත් කර file.txtහෝ වෙනත් කිසිවක්
නොකරන්නේද

මම අදහස් කළේ ඩේබියන් මෙහෙයුම් පද්ධතියේ "m rm! (File.txt)" ආපසු "නරක ලෙස ස්ථානගත කර ඇති () ගේ" ය. ඒ නිසා මම "$ shopt -s extglob" උත්සාහ කළ නමුත් එය නැවත පැමිණියේ: "shopt: විධානය හමු නොවීය". ඊට පස්සේ මම "සොයා" විසඳුම උත්සාහ කළා. එය ක්‍රියාත්මක වේ.
කන්තුර

1
ඔහ්, ඇත්තෙන්ම එය ක්‍රියාත්මක නොවේ. බිල්ඩින් shoptඑකක් නොවේ tcsh.
cuonglm

12

rm !("file.txt")වෙනුවට භාවිතා කරන්නrm !(file.txt)


5
එය කිසිසේත්ම වෙනසක් නොකරයි. මෙහි ඇති ගැටළුව වූයේ OP යනු 1) මෙම ආකෘතියට සහය දක්වන කවචයක් භාවිතා නොකිරීම සහ 2) කඩිනමින් වුවද, ඔබ එය සක්‍රීය කළ යුතුය shopt -s extglob. කෙසේ වෙතත්, එවැනි සරල ගොනු නාමයක් උපුටා දැක්වීමෙන් කිසිදු වෙනසක් සිදු නොවනු ඇත.
ටර්ඩන්

1
යුටිල්ස් ෆෝල්ඩරය තබා ගැනීම සඳහා - rm -rf! ("Utils")
ජේම්ස් ජිටින්

8

වෙනත් පිළිතුරක් ලබා දීම සඳහා, ඔබට rmෆෝල්ඩර මකා නොදමන සුපුරුදු හැසිරීම භාවිතා කළ හැකිය :

mkdir tmp && mv file.txt tmp  # create tmp dir and move files there
rm                            # delete all other files
mv tmp/* . && rm -rf tmp      # move all files back and delete tmp dir

./Tmp දැනටමත් ගොනුවක් ලෙස හෝ ඊටත් වඩා නරක නම්, දැනටමත් එහි ඇති දේවල් සහිත නාමාවලියක් නම් මෙය කරන්නේ කුමක් ද? භාවිතා dirr=mktemp && mv file.txt "$dirr"; rm; mv "$dirr/*" . && rm -rf "$dirr"කිරීමෙන් මෙම ගැටළුව මඟහරවා ගත හැකිය.
ජෝ

4

මෙම ප්‍රවේශය ඉතා සරල, ක්‍රියා කරන අතර විශේෂ දිගු අවශ්‍ය නොවන බව මට පෙනී ගියේය (මා දන්නා!)

ls --hide=file.txt | xargs rm
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.