Làm cách nào để sao chép một thư mục bao gồm các thư mục phụ không bao gồm các tệp hoặc thư mục khớp với một regex nhất định trên hệ thống Windows?Làm cách nào để sao chép thư mục một cách đệ quy và lọc tên tệp trong Perl?
Trả lời
Tôi muốn làm điều gì đó như thế này:
use File::Copy;
sub copy_recursively {
my ($from_dir, $to_dir, $regex) = @_;
opendir my($dh), $from_dir or die "Could not open dir '$from_dir': $!";
for my $entry (readdir $dh) {
next if $entry =~ /$regex/;
my $source = "$from_dir/$entry";
my $destination = "$to_dir/$entry";
if (-d $source) {
mkdir $destination or die "mkdir '$destination' failed: $!" if not -e $destination;
copy_recursively($source, $destination, $regex);
} else {
copy($source, $destination) or die "copy failed: $!";
}
}
closedir $dh;
return;
}
Tôi không biết làm thế nào để làm một loại trừ với một bản sao, nhưng bạn có thể làm việc gì đó dọc theo dòng:
ls -R1 | grep -v <regex to exclude> | awk '{printf("cp %s /destination/path",$1)}' | /bin/sh
Nếu bạn tình cờ được trên một hệ điều hành Unix-like và có quyền truy cập đến rsync (1)
, bạn nên sử dụng điều đó (ví dụ: thông qua system()
).
Tệp của Perl :: Bản sao bị hỏng một chút (không sao chép quyền trên hệ thống Unix), vì vậy nếu bạn không muốn sử dụng các công cụ hệ thống của mình, hãy xem CPAN. Có thể File::Copy::Recursive có thể được sử dụng, nhưng tôi không thấy bất kỳ tùy chọn loại trừ nào. Tôi hy vọng người khác có ý tưởng tốt hơn.
Một tùy chọn khác là Tệp :: Xcopy. Như tên cho biết, nó ít nhiều giả lập lệnh xcopy windows, bao gồm các tùy chọn lọc và đệ quy của nó.
Từ các tài liệu:
use File::Xcopy;
my $fx = new File::Xcopy;
$fx->from_dir("/from/dir");
$fx->to_dir("/to/dir");
$fx->fn_pat('(\.pl|\.txt)$'); # files with pl & txt extensions
$fx->param('s',1); # search recursively to sub dirs
$fx->param('verbose',1); # search recursively to sub dirs
$fx->param('log_file','/my/log/file.log');
my ($sr, $rr) = $fx->get_stat;
$fx->xcopy; # or
$fx->execute('copy');
# the same with short name
$fx->xcp("from_dir", "to_dir", "file_name_pattern");
Một câu trả lời cổ điển sẽ sử dụng 'cpio -p
':
(cd $SOURCE_DIR; find . -type f -print) |
perl -ne 'print unless m/<regex-goes-here>/' |
cpio -pd $TARGET_DIR
Các' cpio
' giao dịch lệnh với việc sao chép thực tế, trong đó có bảo tồn được phép. Bí quyết của 'cd $SOURCE_DIR; find . ...
' thỏa thuận với việc loại bỏ phần dẫn đầu của đường dẫn nguồn khỏi tên. Vấn đề duy nhất với lời gọi đó là 'find
' là nó sẽ không theo các liên kết tượng trưng; bạn cần phải thêm '-follow
' nếu đó là những gì bạn muốn.
nào mà làm việc trên cửa sổ quá? – Manu
- 1. Cách tạo một hàm đệ quy để sao chép tất cả các tệp và thư mục
- 2. Sao chép tệp hoặc thư mục đệ quy bằng Python
- 3. Bash: Sao chép tên file một cách đệ quy, duy trì cấu trúc thư mục
- 4. thư mục và thư mục con xcopy đệ quy và lọc chỉ tên tập tin bằng cách mở rộng
- 5. Trên Linux, làm cách nào để sao chép đệ quy tệp trong khi bỏ qua một số tên nhất định?
- 6. Làm thế nào để lọc tệp khi sử dụng scp để sao chép thư mục đệ quy?
- 7. Làm thế nào tôi có thể đệ quy sao chép nội dung của thư mục bằng Perl?
- 8. CMD: Làm cách nào để đệ quy xóa thuộc tính "Ẩn" của tệp và thư mục
- 9. Làm cách nào để xóa các tệp trong thư mục được sao chép từ một thư mục khác?
- 10. Xóa đệ quy các tệp và thư mục trong C#
- 11. Cách đọc tên tệp đệ quy từ thư mục con bằng cách sử dụng LINQ
- 12. Cách haskell để sao chép một thư mục
- 13. NSIS - Cách sao chép đệ quy trong khi loại trừ tệp?
- 14. Sao chép nội dung thư mục lồng vào một thư mục đệ quy (thiết bị đầu cuối)
- 15. Làm cách nào để sao chép/sao chép một thư mục trên S3?
- 16. Làm cách nào để sao chép đệ quy các tệp của một mẫu cụ thể vào một thư mục phẳng trên Windows?
- 17. VBA để sao chép tệp từ một thư mục này sang một thư mục khác
- 18. Làm thế nào tôi có thể đệ quy đọc các thư mục trong Perl?
- 19. Cách tìm tệp theo cách đệ quy theo loại tệp và sao chép chúng vào thư mục trong khi ở ssh?
- 20. Cách xóa tệp đệ quy
- 21. Làm cách nào để sao chép các tệp của tôi từ một thư mục này sang một thư mục khác?
- 22. Làm cách nào để sao chép nhiều tệp từ một thư mục khác bằng cp?
- 23. Làm cách nào để tìm kiếm một từ trong toàn bộ dự án/thư mục một cách đệ quy?
- 24. Làm thế nào để lặp đệ quy thông qua một cấu trúc file và đổi tên thư mục trong python
- 25. Làm thế nào tôi có thể đệ quy sao chép thư mục vào thư mục khác và chỉ thay thế các tệp chưa thay đổi?
- 26. Tìm nhiều tệp đệ quy và đổi tên trong linux
- 27. Đệ quy đổi tên thư mục trong bash
- 28. Làm cách nào để liệt kê tất cả các tệp tga trong một thư mục (không đệ quy) trong Python?
- 29. Làm cách nào để tìm tập tin đệ quy trong các thư mục
- 30. Trong FTP, làm cách nào để sao chép tệp từ xa sang các thư mục khác
Tôi nghĩ rằng bạn có một vấn đề (vòng lặp vô hạn) trong trường hợp $ regexp của bạn không khớp "." hoặc "..", là hai giá trị đầu tiên của $ entry được trả về bởi readdir. Nếu $ to_dir của bạn không tồn tại và $ source thực sự là thư mục, mkdir sẽ không thành công, tôi khuyên bạn nên sử dụng mkpath thay thế. – huitseeker
. và .. không phải là một vấn đề trên Windows AFAIK, do đó, đó không phải là một vấn đề, nhưng đối với tính di động bạn đúng nó sẽ là tốt hơn để lọc những người ra. Đối với mkpath: cá nhân tôi nghĩ rằng một tình huống như vậy nên đưa ra một lỗi, nhưng đó là một vấn đề của hương vị. –