Câu trả lời:
một for
vòng lặp:
for f in *.c; do cp -- "$f" "$OTHERDIR/old#$f"; done
Tôi thường thêm -v
tùy chọn cp
để cho phép tôi xem tiến trình.
Bạn có thể sử dụng shell globalbing:
for f in *.c; do cp -- "$f" "$OTHERDIR/old#$f"; done
Các for variable in GLOB
định dạng sẽ mở rộng glob để tất cả các file phù hợp / thư mục (trừ ẩn-one) và lặp qua chúng, tiết kiệm mỗi lần lượt là $variable
(trong ví dụ trên, $f
). Vì vậy, lệnh tôi hiển thị sẽ lặp lại trên tất cả các tệp không bị ẩn, sao chép chúng và thêm tiền tố.
cd /foo/bar/; for f in *c
, hoặc sử dụng for f in /foo/bar/*.c; do name=${f##*/} ...
hoặc name=$(basename "$f")
.
Vẫn còn một cách khác:
for f in $(find dir/ -type f | grep -v 'bk_'); do cp -- "$f" "$(dirname $f)/bk_$(pwgen -s 4 1)_$(basename $f)"; done
Mỗi khi bạn chạy theo cách này, nó sẽ chuyển dir / from:
dir/foo/foo.c
dir/bar/bar.c
dir/baz/baz.c
Vào:
dir/foo/foo.c
dir/foo/bk_R3pP_foo.c
dir/bar/bar.c
dir/bar/bk_o1JD_bar.c
dir/baz/baz.c
dir/baz/bk_0QqF_baz.c
Và sau đó:
dir/foo/foo.c
dir/foo/bk_R3pP_foo.c
dir/foo/bk_dV06_foo.c
dir/bar/bar.c
dir/bar/bk_o1JD_bar.c
dir/bar/bk_B68i_bar.c
dir/baz/baz.c
dir/baz/bk_0QqF_baz.c
dir/baz/bk_p6P3_baz.c
Và sau đó...:
dir/foo/foo.c
dir/foo/bk_R3pP_foo.c
dir/foo/bk_dV06_foo.c
dir/foo/bk_2Ar8_foo.c
dir/bar/bar.c
dir/bar/bk_o1JD_bar.c
dir/bar/bk_B68i_bar.c
dir/bar/bk_wX7Z_bar.c
dir/baz/baz.c
dir/baz/bk_0QqF_baz.c
dir/baz/bk_p6P3_baz.c
dir/baz/bk_fPd3_baz.c
.. và như thế.
Đây là cách người ta sẽ làm nó đệ quy nếu cần,
for f in `find . -name \*.c`; do name="${f//\.\//__}"; fileName="${name//\//_}" ; echo "Copying $f as $OTHERDIR/old#$fileName"; cp -- "$f" "$OTHERDIR/$fileName"; done
find
quả đầu ra
Đây là một lót sử dụng xargs
, tr
và Globing. Có thể có một số giá trị.
echo *.c | tr ' ' '\n' | xargs -n1 -I{} cp "{}" "PREFIX{}"
Điều này trả về tất cả các tệp khớp với nhau *.c
như một chuỗi được phân tách bằng dấu cách. Tiếp theo, tr
biến các khoảng trắng thừa thành dòng mới ( NB không kiểm tra tên tệp có khoảng trắng **). Sau đó, xargs
được điền với mỗi tên tệp và chạy cp
với tên và tiền tố thích hợp.
*.c
có thể được sửa đổi cho các quả cầu khác, hữu ích. Các tiền tố khác trong xargs
và cp
một phần cũng có thể được sử dụng.
(yêu cầu find
hỗ trợ mà -print0
) Tương tự như trên, chúng ta có thể sử dụng find
để sản xuất một vô danh -seperated của tác phẩm, và tinh chỉnh xargs
với một lá cờ để tách trên rỗng
find . -name '*.c' -print0 | xargs -0 -n1 -I{} cp "{}" "PREFIX{}"
for f in /foo/bar/*.c
,$f
sẽ chứa toàn bộ đường dẫn, thay vào đó chỉ là tên của tệp. Làm thế nào tôi có thể chỉ có được tên của tập tin?