Chỉ cần tìm những tờ tiền trống
Để chỉ tìm các thư mục trống (như được chỉ định trong tiêu đề câu hỏi), câu trả lời của mosg là đúng:
find -type d -empty
Nhưng -empty
có thể không khả dụng trên find
các phiên bản rất cũ (đây là trường hợp của HP-UX chẳng hạn). Nếu đây là trường hợp của bạn, hãy xem các kỹ thuật được mô tả trong phần bên dưới Thư mục có trống không? .
Xóa dirs trống
Điều này hơi phức tạp: Giả sử một thư mục MyDir
chứa các thư mục trống. Sau khi loại bỏ các thư mục trống này, MyDir
sẽ trở thành một thư mục trống và cũng nên được gỡ bỏ. Do đó, tôi sử dụng lệnh rmdir
với tùy chọn --parents
(hoặc -p
) cũng xóa các thư mục mẹ khi có thể:
find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} +
Trên find
phiên bản cũ hơn , câu lệnh +
chưa được hỗ trợ, do đó bạn có thể sử dụng ;
thay thế:
find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} `;`
Một thư mục trống?
Hầu hết các câu trả lời này giải thích cách kiểm tra xem thư mục có trống hay không. Vì vậy, tôi cung cấp ở đây ba kỹ thuật khác nhau mà tôi biết:
[ $(find your/dir -prune -empty) = your/dir ]
d=your/dir
if [ x$(find "$d" -prune -empty) = x"$d" ]
then
echo "empty (directory or file)"
else
echo "contains files (or does not exist)"
fi
Một biến thể:
d=your/dir
if [ x$(find "$d" -prune -empty -type d) = x"$d" ]
then
echo "empty directory"
else
echo "contains files (or does not exist or is not a directory)"
fi
Giải trình:
find -prune
tương tự như find -maxdepth 0
việc sử dụng ít ký tự hơn
find -type d
chỉ in thư mục
find -empty
in các thư mục và tệp trống
> mkdir -v empty1 empty2 not_empty
mkdir: created directory 'empty1'
mkdir: created directory 'empty2'
mkdir: created directory 'not_empty'
> touch not_empty/file
> find empty1 empty2 not_empty -prune -empty
empty1
empty2
(( ${#files} ))
Thủ thuật này là 100% bash
nhưng gọi (sinh ra) một trình bao phụ. Ý tưởng là của Bruno De Fraine và được cải thiện bởi nhận xét của teambob . Tôi khuyên cái này nếu bạn sử dụngbấu víu và nếu script của bạn không cần phải di động.
files=$(shopt -s nullglob dotglob; echo your/dir/*)
if (( ${#files} ))
then
echo "contains files"
else
echo "empty (or does not exist or is a file)"
fi
Lưu ý: không có sự khác biệt giữa thư mục trống và thư mục không tồn tại (và ngay cả khi đường dẫn được cung cấp là một tệp).
[ $(ls -A your/dir) ]
Thủ thuật này được lấy cảm hứng từ bài báo của nixCraft được đăng vào năm 2007. Andrew Taylor đã trả lời vào năm 2008 và gr8can8dian vào năm 2011.
if [ "$(ls -A your/dir)" ]
then
echo "contains files"
else
echo "empty (or does not exist or is a file)"
fi
hoặc phiên bản bashism một dòng:
[[ "$(ls -A your/dir)" ]] && echo "contains files" || echo "empty or ..."
Lưu ý: ls
trả về $?=2
khi thư mục không tồn tại. Nhưng không có sự khác biệt giữa một tệp và một thư mục trống.