समस्या: मूल निर्देशिका के आधार नाम के साथ, फ़ाइल के शीर्ष पर एक फ़ाइल टैग करें।
यानी, के लिए
/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##6841 पर आधारित है।
printf "${PWD##*/}\n" | cat - <file> > temp && mv -f temp <file>
ध्यान दें कि -
बिल्ली कमांड में आवश्यक है (मानक इनपुट पढ़ता है: man cat
अधिक जानकारी के लिए देखें)। यहाँ, मेरा मानना है कि, प्रिंटफ स्टेटमेंट (एसटीडीआईएन) के आउटपुट को लेना आवश्यक है, और कैट कि और फ़ाइल को अस्थायी करने के लिए ... http://www.linfo.org/cat के नीचे भी स्पष्टीकरण देखें .html ।
जब मैंने फाइलों को अधिलेखित करने के लिए पुष्टिकरण के लिए कहा, -f
तो मैंने भी mv
कमांड को जोड़ा ।
एक निर्देशिका पर पुनर्खरीद करने के लिए:
for file in *; do printf "${PWD##*/}\n" | cat - $file > temp && mv -f temp $file; done
ध्यान दें कि यह रिक्त स्थान के साथ पथों पर टूट जाएगा; वहाँ समाधान हैं, कहीं और (जैसे फ़ाइल ग्लोबिंग, या find . -type f ...
टाइप समाधान) उन लोगों के लिए।
पता : मेरी आखिरी टिप्पणी, यह स्क्रिप्ट आपको रास्तों में रिक्त स्थान के साथ निर्देशिकाओं की पुनरावृत्ति करने की अनुमति देगा:
#!/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
।