VẤN ĐỀ: gắn thẻ một tệp, ở đầu tệp, với tên cơ sở của thư mục mẹ.
Tức là cho
/mnt/Vancouver/Programming/file1
gắn thẻ trên cùng file1
với Programming
.
GIẢI PHÁP 1 - tệp không trống:
bn=${PWD##*/} ## bn: basename
sed -i '1s/^/'"$bn"'\n/' <file>
1s
đặt văn bản ở dòng 1 của tập tin.
GIẢI PHÁP 2 - tệp trống hoặc không trống:
Các sed
lệnh, trên, thất bại trên các tập tin trống. Đây là một giải pháp, dựa trên /superuser/246837/how-do-i-add-text-to-the-beginning-of-a-file-in-bash/246841#246841
printf "${PWD##*/}\n" | cat - <file> > temp && mv -f temp <file>
Lưu ý rằng lệnh -
in cat là bắt buộc (đọc đầu vào tiêu chuẩn: xem man cat
để biết thêm thông tin). Ở đây, tôi tin rằng, cần phải lấy đầu ra của câu lệnh printf (tới STDIN), và đưa tệp đó vào tệp tạm thời ... Xem thêm phần giải thích ở cuối http://www.linfo.org/cat .html .
Tôi cũng đã thêm -f
vào mv
lệnh, để tránh bị yêu cầu xác nhận khi ghi đè lên tập tin.
Để lặp lại qua một thư mục:
for file in *; do printf "${PWD##*/}\n" | cat - $file > temp && mv -f temp $file; done
Cũng lưu ý rằng điều này sẽ phá vỡ các đường dẫn có khoảng trắng; có những giải pháp, ở những nơi khác (ví dụ như tập tin toàn cầu, hoặc find . -type f ...
giải pháp -type) cho những giải pháp đó.
ĐỊA CHỈ: Re: bình luận cuối cùng của tôi, tập lệnh này sẽ cho phép bạn lặp lại các thư mục có khoảng trắng trong đường dẫn:
#!/bin/bash
## /programming/4638874/how-to-loop-through-a-directory-recursively-to-delete-files-with-certain-extensi
## To allow spaces in filenames,
## at the top of the script include: IFS=$'\n'; set -f
## at the end of the script include: unset IFS; set +f
IFS=$'\n'; set -f
# ----------------------------------------------------------------------------
# SET PATHS:
IN="/mnt/Vancouver/Programming/data/claws-test/corpus test/"
# /superuser/716001/how-can-i-get-files-with-numeric-names-using-ls-command
# FILES=$(find $IN -type f -regex ".*/[0-9]*") ## recursive; numeric filenames only
FILES=$(find $IN -type f -regex ".*/[0-9 ]*") ## recursive; numeric filenames only (may include spaces)
# echo '$FILES:' ## single-quoted, (literally) prints: $FILES:
# echo "$FILES" ## double-quoted, prints path/, filename (one per line)
# ----------------------------------------------------------------------------
# MAIN LOOP:
for f in $FILES
do
# Tag top of file with basename of current dir:
printf "[top] Tag: ${PWD##*/}\n\n" | cat - $f > temp && mv -f temp $f
# Tag bottom of file with basename of current dir:
printf "\n[bottom] Tag: ${PWD##*/}\n" >> $f
done
unset IFS; set +f
sed
.