Câu trả lời:
một forvòng lặp:
for f in *.c; do cp -- "$f" "$OTHERDIR/old#$f"; done
Tôi thường thêm -vtù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
findquả đầu ra
Đây là một lót sử dụng xargs, trvà 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 *.cnhư một chuỗi được phân tách bằng dấu cách. Tiếp theo, trbiế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 cpvới tên và tiền tố thích hợp.
*.ccó thể được sửa đổi cho các quả cầu khác, hữu ích. Các tiền tố khác trong xargsvà cpmột phần cũng có thể được sử dụng.
(yêu cầu findhỗ 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 xargsvớ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,$fsẽ 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?