2012-02-13 26 views
5

Tôi đã txt tập tin với nội dung như thế nàylệnh mkdir cho một danh sách các tên tập tin đường dẫn

/home/username/Desktop/folder/folder3333/IMAGw488.jpg 
/home/username/Desktop/folder/folder3333/IMAG04f88.jpg 
/home/username/Desktop/folder/folder3333/IMAGe0488.jpg 
/home/username/Desktop/folder/folder3333/IMAG0r88.jpg 
/home/username/Desktop/folder/folder3333/ 
/home/username/Desktop/folder/ 
/home/username/Desktop/folder/IMAG0488.jpg 
/home/username/Desktop/folder/fff/fff/feqw/123.jpg 
/home/username/Desktop/folder/fffa/asd.png 
.... 

đây là những tên tập tin đường dẫn mà còn đường dẫn của thư mục. Vấn đề tôi muốn giải quyết là tạo tất cả các thư mục không tồn tại.

Tôi muốn gọi lệnh mkdir cho mỗi thư mục không tồn tại

Làm cách nào để thực hiện điều này một cách dễ dàng?

Cảm ơn

Trả lời

8

này có thể được thực hiện trong bash cú pháp bản địa mà không cần bất kỳ cuộc gọi đến các chương trình ngoài:

while read line; do mkdir -p "${line%/*}"; done < infile 

Hoặc có lẽ với một chỉ là một đơn hãy gọi tới số mkdir nếu bạn có bash 4.x

mapfile -t arr < infile; mkdir -p "${arr[@]%/*}" 
2

Làm thế nào về ...

for p in $(xargs < somefile.txt); 
do 
    mkdir -p $(dirname ${p}) 
done 
+1

Có một số cách đẹp hơn để xử lý vấn đề này, 'bash' có cơ sở vật chất rất trưởng thành để xử lý tập tin, nhưng điều này là tốt đẹp và ngắn. – cha0site

+1

'xargs' chắc chắn là không cần thiết. 'trong khi đọc p tripleee

+0

... Hoặc bạn có thể' sed 's% [^ /] * $ %%' somefile.txt | xargs mkdir -p' – tripleee

0

Nó có thể được thực hiện mà không vòng lặp cũng (được cung cấp tập tin đầu vào không lớn):

mkdir -p $(perl -pe 's#/(?!.*/).*$##' file.txt) 
2
xargs -n 1 dirname <somefile.txt | xargs mkdir -p 
0

Nếu bạn có tập tin "file1" với tên tập tin bạn có thể thử oneliner này:

cat file1 |xargs -I {} dirname "{}"| sort -u | xargs -I{} mkdir -p "{}" 

Sử dụng:

xargs -I{} mkdir -p "{}" 

đảm bảo rằng đêm trước tên đường dẫn n với các không gian sẽ được tạo

Các vấn đề liên quan