Sao chép nội dung của thư mục hiện tại vào thư mục con


13

Làm cách nào tôi có thể sử dụng thiết bị đầu cuối Linux để sao chép mọi thứ trong thư mục hiện tại sang thư mục con?


Bạn có nghĩa là sao chép hoặc di chuyển?
Craig

Câu trả lời:


12

Nếu bạn muốn sao chép nội dung của thư mục một cách đệ quy (sẽ đưa ra 1 lỗi, các lựa chọn thay thế bên dưới):

cp -r * sub/

Một chút hacky, nhưng hoạt động trên các thư mục con không trống:

TARGETDIR='targetdir here';cp -r `find . -maxdepth 1 ! -name "$TARGETDIR"` "$TARGETDIR"

Một oneliner khác:

TARGETDIR='targetdir here';for file in *;do test "$file" != "$TARGETDIR" && cp "$file" "$TARGETDIR/";done

Hoặc đệ quy:

TARGETDIR='z';for file in *;do test "$file" != "$TARGETDIR" && cp -r "$file" "$TARGETDIR/";done

điều này không hoạt động trong trường hợp sub / không trống -> sub sẽ được sao chép lại vào sub, trừ khi đó là điều @Oguz muốn.

Ok Cuối cùng tôi cũng hài lòng với findmã: D
Lekensteyn

2
Lệnh thứ hai của bạn không thành công cho tên tệp bao gồm khoảng trắng. Sử dụng xargshoặc -exec. Không cần grep- sử dụng ! -name "$TARGETDIR"hoặc tương tự. Bạn có dấu ngoặc kép chưa từng có xung quanh $file. Tôi không nghĩ rằng một đệ quy cpsẽ hoạt động theo cách bạn dự định trong bất kỳ lệnh nào ngoài lệnh đầu tiên của bạn.
Tạm dừng cho đến khi có thông báo mới.

Wohaa, đã bỏ lỡ một trích dẫn trong các mã cuối cùng. Nhận xét tốt Dennis, tôi chưa bao giờ nghĩ đến việc sử dụng -name trong trường hợp này :)
Lekensteyn

4

Giả sử targetlà tên của thư mục con đích, nếu shell của bạn bị bash:

shopt -s extglob
cp -r !(target) target/

Trong ksh, bạn có thể trực tiếp làm cp -r !(target) target/.

Trong zsh, bạn có thể làm setopt ksh_globsau đó cp -r !(target) target/. Một khả năng khác là setopt extended_globsau đó cp -r ^target target/.


2

Tôi sẽ đề nghị di chuyển thư mục đích bên ngoài thư mục nguồn và sau đó đặt lại; mv là miễn phí (nếu bạn cẩn thận không chuyển sang một hệ thống tập tin khác), trừ khi bạn đang mong đợi các quá trình khác can thiệp / bị can thiệp.

Hầu hết các giải pháp được đăng ở trên sẽ không hoạt động nếu có khoảng trắng trong tên tệp. Tôi sẽ đề nghị sử dụng các biến thể của find -print0 | xargs -0, hoặc tìm -exec, v.v.


0

Điều này sẽ làm việc cho bạn?

cp -r * subdir/

Nếu bạn định di chuyển thay vì sao chép mọi thứ trong thư mục hiện tại sang thư mục con, bạn có thể làm:

mv * subdir/

điều này không quan tâm đến các thư mục không trống

Tôi chỉ thử nghiệm, và nó đã làm việc.
karlphillip

bạn cần sao chép các thư mục không trống theo cách đệ quy như @Lekensteyn đề xuất.


-1

Điều này đi vào tập tin nói dirCopy.sh



for i in `ls`
do
        if [ $i != "subDir" ]
        then
                `cp -r $i subDir`
        fi
done

chạy nó dưới dạng "sh dirCopy.sh" trong bảng điều khiển của bạn


2
Không cần ls: for file in *. Không cần backticks - sử dụng $(). Không cần backticks (hoặc $()) xung quanh cplệnh (điều đó sẽ tạo ra một thông báo lỗi).
Tạm dừng cho đến khi có thông báo mới.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.