ปัญหา:แท็กไฟล์ที่ด้านบนของไฟล์ด้วยชื่อฐานของไดเรกทอรีหลัก
เช่นสำหรับ
/mnt/Vancouver/Programming/file1
แท็กด้านบนของที่มีfile1
Programming
โซลูชัน 1 - ไฟล์ที่ไม่ว่าง:
bn=${PWD##*/} ## bn: basename
sed -i '1s/^/'"$bn"'\n/' <file>
1s
วางข้อความที่บรรทัด 1 ของไฟล์
โซลูชัน 2 - ไฟล์เปล่าหรือไฟล์ไม่ว่าง:
sed
คำสั่งข้างต้นล้มเหลวในไฟล์ที่ว่างเปล่า นี่คือวิธีแก้ไขตาม/superuser/246837/how-do-i-add-text-to-the-beginning-of-a-file-in-bash/246841/how-do-i
printf "${PWD##*/}\n" | cat - <file> > temp && mv -f temp <file>
โปรดทราบว่า-
จำเป็นต้องใช้คำสั่ง in ในคำสั่ง cat (อ่านอินพุตมาตรฐาน: ดูman cat
ข้อมูลเพิ่มเติม) ที่นี่ฉันเชื่อว่ามันเป็นสิ่งจำเป็นที่จะใช้เอาท์พุทของคำสั่ง printf (เพื่อ STDIN) และ cat ที่และไฟล์ที่จะ temp ... ดูคำอธิบายที่ด้านล่างของhttp://www.linfo.org/cat .html
ฉันยังเพิ่ม-f
ไปยังmv
คำสั่งเพื่อหลีกเลี่ยงการถูกถามยืนยันเมื่อเขียนทับไฟล์
ในการเรียกคืนไปยังไดเรกทอรี:
for file in *; do printf "${PWD##*/}\n" | cat - $file > temp && mv -f temp $file; done
โปรดทราบว่าสิ่งนี้จะทำลายเส้นทางที่มีช่องว่าง มีวิธีแก้ไขปัญหาที่อื่น (เช่นไฟล์ globbing หรือfind . -type f ...
- ประเภทโซลูชั่น) สำหรับผู้ที่
เพิ่ม: Re: ความคิดเห็นล่าสุดของฉันสคริปต์นี้จะช่วยให้คุณสามารถชดเชยไดเรกทอรีที่มีช่องว่างในเส้นทาง:
#!/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
คุณไม่จำเป็นต้องใช้