Mkdir foo; svn mv * foo


9

Tôi thường muốn làm một số biến thể của thành ngữ này:

$ mkdir 2010
$ svn mv * 2010

Tất nhiên, tôi cũng gặp lỗi vì toàn cầu khớp với năm 2010:

svn: Cannot copy path '2010' into its own child '2010/2010'

Có cách nào để thay thế "svn mv * 2010"bằng một lớp lót khác mà làm đúng?


Đây không phải là một câu hỏi cụ thể cho svn, nó cũng áp dụng cho vanilla mv. Tuy nhiên, với mv, mv * newdirlàm việc cho tôi, mặc dù có lỗi.
crazy2be

Câu trả lời:


14

Theo ksh, bash hoặc zsh:

svn mv !(2010) 2010

Trong bash, bạn cần chạy shopt -s extglobtrước (đặt nó vào trong ~/.bashrc). Theo zsh, bạn cần chạy setopt -o ksh_globtrước (đặt nó vào trong ~/.zshrc).

Điều này không di chuyển các tập tin dấu chấm (các tập tin có tên bắt đầu .). Nếu bạn có một số, di chuyển chúng riêng biệt. Hãy cẩn thận để loại trừ .svnthư mục nếu bạn có. Trong ksh hoặc zsh:

svn mv !(2010) .!(svn) 2010

Trong bash, điều này phức tạp hơn vì bạn cũng cần loại trừ rõ ràng ....

svn mv !(2010) .!(svn|.|) 2010

Zsh cũng có một cú pháp khác, ngắn hơn, yêu cầu chạy setopt -o extended_globtrước (một lần nữa, đặt cái này vào ~/.zshrc):

svn mv {^,}2010

Mở rộng cú đúp đầu tiên đi vào chơi, kết quả là svn mv ^2010 2010. Sau đó, mẫu ^2010(một lối tắt cho các tập tin phù hợp với các tập tin *nhưng không 2010được mở rộng).

Nếu bạn có một .svnthư mục, bạn sẽ cần loại trừ nó khỏi di chuyển. Theo mặc định, điều này là ổn, vì .svnnó không khớp với *(đó là một tệp chấm). Tuy nhiên, có những biến chứng:

  • Nếu bạn đã đặt glob_dotstùy chọn, bạn cũng cần loại trừ .svn:

    svn mv !(2010|.svn) 2010             # requires setopt ksh_glob
    svn mv *~(.svn|2010) 2010            # requires setopt extended_glob
  • Nếu bạn có tệp chấm và bạn chưa đặt glob_dots, bạn sẽ cần di chuyển chúng một cách riêng biệt:

    svn mv {^,}2010
    svn mv .*~.svn 2010

    Để làm điều đó trong một lần:

    svn mv *~(.svn|2010)(D) 2010

Một cách khác có thể hoạt động trong zsh trong trường hợp này (nếu bạn không có thư mục con) là svn mv *(.D) 2010, chỉ khớp với các tệp thông thường ( .) bao gồm các tệp chấm ( D).


3

ZSH có một toán tử toàn cầu hữu ích để khớp mọi thứ trừ một tên cụ thể , ^. Vì vậy, điều này sẽ hoạt động (nhưng đó là ZSH cụ thể và setopt extendedglobtrước tiên bạn cần phải có ):

$ svn mv ^2010 2010

Tôi đã biết về !()cú pháp làm việc với zsh. Làm thế nào để ^cú pháp khác nhau? Nó không hoạt động trong vỏ của tôi, tôi cần cài đặt tùy chọn nào để kích hoạt nó?
Caleb

@Caleb Xin lỗi, tôi nghĩ rằng nó được bật theo mặc định, nhưng rõ ràng bạn cần phải setopt extendedglob. Tôi không biết về !()nó, nghe có vẻ như là một cách xuyên suốt hơn để làm điều đó
Michael Mrozek

svn mv {^,}2010để tránh gõ tên thư mục hai lần
Gilles 'SO- ngừng trở nên xấu xa'

0

Nếu các tệp của bạn có tên thuần hóa tên tuổi (không có khoảng trắng, ký tự không thể in hoặc \[?*):

svn mv $(ls | grep -vx 2010) 2010

2
Các tập tin không thể được tin cậy để có tên "thuần hóa". Bao giờ :) Các giải pháp toàn cầu shell được trình bày cho bash và zsh gọn gàng khắc phục vấn đề này.
Caleb
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.