ฉันไม่จำเป็นต้องย้ายโฟลเดอร์เฉพาะไฟล์
ฉันลองแล้วmv *
แต่คำสั่งนี้ย้ายโฟลเดอร์ด้วย
ฉันไม่จำเป็นต้องย้ายโฟลเดอร์เฉพาะไฟล์
ฉันลองแล้วmv *
แต่คำสั่งนี้ย้ายโฟลเดอร์ด้วย
คำตอบ:
หากคุณต้องการย้ายทุกอย่างยกเว้นไดเรกทอรี$SOURCE_DIR
ไปยัง$TARGET_DIR
คุณสามารถใช้คำสั่งนี้:
find "$SOURCE_DIR" -maxdepth 1 -not -type d -exec mv -t "$TARGET_DIR" -- '{}' +
อธิบายรายละเอียด:
find
: การค้นหาค้นหาไฟล์ในไดเรกทอรี$SOURCE_DIR
: ไดเรกทอรีที่จะค้นหา-maxdepth 1
: อย่ามองเข้าไปในไดเรกทอรีย่อย-not -type d
: ละเว้นไดเรกทอรี
-type f
หากคุณต้องการคัดลอกสิ่งต่าง ๆ ที่เป็นไฟล์อย่างเคร่งครัดเท่านั้น แต่ฉันชอบมากกว่าเพราะมันจะจับทุกอย่างที่ไม่ใช่ไฟล์หรือไดเรกทอรี (ในลิงค์สัญลักษณ์โดยเฉพาะ)-exec mv -t "$TARGET_DIR" -- '{}' +
: เรียกใช้คำสั่งmv -t "$TARGET_DIR" -- FILES...
ที่FILES...
เป็นไฟล์ที่ตรงกันทั้งหมด (ขอบคุณ @DavidFoerster)ฉันคิดว่าคุณต้องการ mv เฉพาะไฟล์ของคุณแรกไปที่ไดเรกทอรีของคุณและใช้คำสั่งนี้แทนที่ $ TARGET ด้วยเส้นทางไดเรกทอรีเป้าหมายของคุณ หากคุณต้องการที่จะคัดลอกไฟล์ของคุณแทนที่ด้วยmv
cp
find . -type f -exec mv {} $TARGET \;
ถ้าฉันอธิบายสิ่งนี้find . -type f
หมายถึงเลือกไฟล์ทั้งหมดและ-exec mv {} $TARGET \;
หมายถึงดำเนินการmv
คำสั่งไปยังรายการที่เลือกทั้งหมด
คำตอบก่อนหน้านี้มีข้อผิดพลาด .. มันmv
ไฟล์ทั้งหมดในไดเรกทอรีย่อยด้วย -maxdepth 1
การแก้ไขอย่างรวดเร็วคือการใช้ จากนั้นจะไม่เรียกซ้ำmv
ไฟล์ภายในไดเรกทอรีย่อย ด้านล่างคืออันที่ถูกต้อง ..
find . -maxdepth 1 -type f -exec mv {} $TARGET \;
-type f
ไม่ได้ป้องกันการเรียกซ้ำ
เมื่อจัดการกับไฟล์ซ้ำ ๆfind
เป็นวิธีที่จะไป ในกรณีพิเศษนี้ไม่จำเป็น แต่สามารถใช้กับ-maxdepth 1
คำตอบอื่น ๆ ได้
คำสั่ง python แบบง่ายก็สามารถทำได้เช่นกัน นี่คือตัวอย่าง:
$ tree
.
├── a_directory
└── a_file
$ python -c "import os,shutil;fl=[f for f in os.listdir('.') if os.path.isfile(f)];
> map(lambda x:shutil.move(x,'./a_directory'),fl)"
$ tree
.
└── a_directory
└── a_file
1 directory, 1 file
fl=[f for f in os.listdir('.') if os.path.isfile(f)]
วนซ้ำทุกรายการที่ os.listdir('.')
พบและเราทดสอบว่ารายการนั้นเป็นไฟล์ที่ใช้os.path.isfile()
ฟังก์ชั่นหรือไม่
เมื่อfl
สร้างรายการไฟล์แล้วเราจะใช้map()
ฟังก์ชั่น ฟังก์ชั่นนี้ใช้เวลาสองข้อโต้แย้ง - ฟังก์ชั่นและรายการของรายการ; มันจะใช้งานฟังก์ชั่นที่เรามอบให้สำหรับแต่ละไฟล์ในรายการ ดังนั้นที่นี่เรามีlambda x:shutil.move(x,'./a_directory')
ฟังก์ชั่นที่ไม่ระบุชื่อซึ่งจะย้ายไฟล์ที่ได้รับไปยังไดเรกทอรีที่กำหนดและจากนั้นเรามีfl
- รายการของไฟล์ที่เราสร้างขึ้น
เพื่อความสะดวกในการอ่านและการใช้งานทั่วไปเราสามารถเขียนสคริปต์นี้เป็นสคริปต์ไพ ธ อนทั่วไปซึ่งใช้สองข้อโต้แย้ง - ไดเรกทอรีต้นทางและไดเรกทอรีย่อยปลายทาง
#!/usr/bin/env python3
from os import listdir
from os.path import isfile,realpath
from os.path import join as joinpath
from shutil import move
from sys import argv
# this is script's full path
script=realpath(__file__)
# get all items in a given directory as list of full paths
fl=[ joinpath(argv[1],f) for f in listdir(argv[1]) ]
# filter out script itself ( just in case) and directories
fl_filtered = [ f for f in fl if isfile(f) and not script == realpath(f) ]
# Uncomment this in case you want to see the list of files to be moved
# print(fl_filtered)
# move the list of files to the given destination
for i in fl_filtered:
move(i,argv[2])
และการใช้งานก็เป็นเช่นนั้น:
$ tree
.
├── a_directory
├── a_file
└── files2subdir.py
1 directory, 2 files
# Notice: the script produces no output unless you uncomment print statement
$ ./files2subdir.py "." "./a_directory"
$ tree
.
├── a_directory
│ └── a_file
└── files2subdir.py
หากคุณกำลังใช้ zsh แทนที่จะทุบตีคุณสามารถทำได้:
mv "$SOURCE"/*(.) "$TARGET"
(.)
ในตอนท้ายที่เรียกว่ารอบคัดเลือก glob; .
ภายในโดยเฉพาะหมายถึงเพียงตรงกับไฟล์ปกติ
การทำ a mv *(.) "$target"
นั้นรวดเร็วและใช้งานได้จริง อย่างไรก็ตามหากคุณทำเช่นนี้เป็นส่วนหนึ่งของสคริปต์คุณอาจต้องการพิจารณาเขียนสิ่งที่ Frxstrem และ David Forester แนะนำmv -t "$target" -- *(.)
แทนเพื่อจัดการกับกรณีมุมที่อาจเกิดขึ้นในการใช้งานของผู้อื่น
mv -t "$TARGET" -- "$SOURCE"/*(.)
จะปลอดภัยกว่า (ในกรณีที่"$TARGET"
เริ่มต้นด้วย-
หรือไม่ใช่ไดเรกทอรี) ฉันชอบโซลูชัน zsh แต่!
ในการย้ายทุกอย่างยกเว้นไดเรกทอรีจากsource-dir
ไดเรกทอรีไปยังdestination-dir
ไดเรกทอรีใน Python:
#!/usr/bin/env python3
"""Usage: mv-files <source-dir> <destination-dir>"""
import shutil
import sys
from pathlib import Path
if len(sys.argv) != 3:
sys.exit(__doc__) # print usage & exit 1
src_dir, dest_dir = map(Path, sys.argv[1:])
for path in src_dir.iterdir():
if not path.is_dir():
shutil.move(str(path), str(dest_dir / path.name))
import mypackage
ก่อนfrom mypackage import ...
from __future__
การนำเข้าพิเศษและfrom pathlib
การนำเข้าทั่วไป
import module
ควรเป็นอันดับแรก (ซึ่งเป็นห้องสมุดและการนำเข้าจากบุคคลที่สาม) from module import object
ควรเป็นครั้งสุดท้าย (เฉพาะในท้องถิ่น / ห้องสมุด)
ฉันจะใช้
mv *.*
สิ่งนี้จะทำงานได้ตราบใดที่โฟลเดอร์ของคุณไม่มีส่วนขยาย
find ... -exec mv -t "$TARGET_DIR" -- '{}' +
จะปลอดภัยกว่า (ในกรณีที่$TARGET_DIR
ไม่มีไดเรกทอรีหรือการจับคู่เริ่มต้นด้วย-
) และมีประสิทธิภาพมากขึ้น (เพราะไม่ทำให้กระบวนการย่อยใหม่เกิดขึ้นสำหรับไฟล์ที่ตรงกันทุกไฟล์)