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?
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?
Câu trả lời:
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
find
mã: D
xargs
hoặ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 cp
sẽ 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.
Giả sử target
là 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_glob
sau đó cp -r !(target) target/
. Một khả năng khác là setopt extended_glob
sau đó cp -r ^target target/
.
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.
Đ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 sẽ sao chép mọi thứ, bao gồm các tệp chấm và không bao gồm chính thư mục đích, vào thư mục đích SUBDIR
:
for i in `ls -a | grep -Ev '^(SUBDIR|\.\.?)$'`; do cp $i SUBDIR; done
Đ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
ls
: for file in *
. Không cần backticks - sử dụng $()
. Không cần backticks (hoặc $()
) xung quanh cp
lệnh (điều đó sẽ tạo ra một thông báo lỗi).