Tôi đang cố gắng cập nhật dấu thời gian của tất cả các thư mục trong cwd bằng cách sử dụng:
for file in `ls`; do touch $file; done
Nhưng nó dường như không hoạt động. Bất cứ ý tưởng tại sao?
Tôi đang cố gắng cập nhật dấu thời gian của tất cả các thư mục trong cwd bằng cách sử dụng:
for file in `ls`; do touch $file; done
Nhưng nó dường như không hoạt động. Bất cứ ý tưởng tại sao?
Câu trả lời:
Tất cả các câu trả lời cho đến nay (cũng như ví dụ của bạn trong câu hỏi) cho rằng bạn muốn touch
mọi thứ trong thư mục, mặc dù bạn đã nói "chạm vào tất cả các thư mục". Nếu hóa ra thư mục chứa các tệp và thư mục và bạn chỉ muốn cập nhật các thư mục, bạn có thể sử dụng find
:
$ find . -maxdepth 1 -mindepth 1 -type d -exec touch {} +
Hoặc nếu find
việc triển khai của bạn không hỗ trợ các vị từ -mindepth
/ tiêu chuẩn -maxdepth
:
$ find . ! -name . -prune -type d -exec touch {} +
Điều này:
$ touch -c -- */
Nên hoạt động trong hầu hết các shell ngoại trừ:
touch
liên kết đến các thư mục ngoài các thư mục đơn giản*
ở vỏ ngoài csh
, tcsh
, zsh
, fish
hoặc vỏ Thompson (mà sẽ báo cáo một lỗi thay vì). Ở đây, chúng tôi đang sử dụng -c
để làm việc xung quanh nó, mặc dù đó vẫn có thể touch
là một tệp không có thư mục được gọi *
.Với zsh
, touch
chỉ các thư mục, bao gồm cả những thư mục ẩn:
touch -- *(D/)
{} \+
là đặc biệt find
cú pháp - đọc man page để biết thêm. Tôi nghĩ rằng touch -c ./*/
sẽ làm việc như là tốt.
-maxdepth 1
lệnh, để find
không lặp lại thành các thư mục con. OP dường như chỉ muốn chạm vào các thư mục đó trong cwd, không phải các thư mục con.
Thử
touch ./*
Nó tránh những thứ không cần thiết for
vòng lặp sẽ tạo ra một quy trình mới cho mỗi tệp duy nhất và hoạt động cho tất cả các tên tệp, ngay cả những tệp có khoảng trắng hoặc các tệp trông giống như tùy chọn (như -t
). Lần duy nhất nó không hoạt động là nếu bạn không có tệp (không phải dấu chấm) trong thư mục trong trường hợp bạn sẽ tạo một tệp có tên *
. Để tránh điều đó, đối với trường hợp cụ thể của touch
hầu hết các triển khai có một -c
tùy chọn (còn được gọi --no-create
trong các phiên bản GNU) để không tạo các tệp không tồn tại, tức là
touch -c ./*
Xem thêm các tài liệu tham khảo tốt trong câu trả lời jasonwryan của cũng như này một .
find . -type d -maxdepth1 -print0 | xargs -0 touch
, hoặc câu trả lời của MichaelMrozek ở trên.
Bạn không nên cố gắng phân tích đầu ra củals
.
Ngoài ra, bạn nên trích dẫn của bạn "$file"
để nắm bắt bất kỳ khoảng trắng. Xem http://www.grymoire.com/Unix/Quote.html
Một cái gì đó như thế này có thể đạt được những gì bạn đang có sau:
for file in *; do touch "$file"; done
Xem hai cạm bẫy Bash đầu tiên để được giải thích kỹ hơn.
*
không chụp các tệp và thư mục có tên bắt đầu bằng dấu chấm. Một cách để khắc phục đó là kích hoạt dotglob
tùy chọn shell thông qua shopt -s dotglob
.