Заменить несколько файлов одним файлом

Представьте, что мой каталог выглядел так:

./original.txt
./blah.1.txt
./blah.2.txt
[...]
./blah.999999.txt

Я хочу заменить каждый blah.* файл содержимым original. Моя первая попытка была сделать это:

$ cp original.txt blah.*

Но я получаю:

cp: target ``blah.1.txt' is not a directory

2
задан 14 September 2012 в 04:30

5 ответов

Еще один вариант с tee:

cat original.txt | tee blah.*

И вот контрольный пример, который вы можете попробовать дома под наблюдением ответственного взрослого:

$ echo "rawr" | tee blah.{1..99}.txt
rawr

$ ls
blah.10.txt  blah.26.txt  blah.41.txt  blah.57.txt  blah.72.txt  blah.88.txt
blah.11.txt  blah.27.txt  blah.42.txt  blah.58.txt  blah.73.txt  blah.89.txt
blah.12.txt  blah.28.txt  blah.43.txt  blah.59.txt  blah.74.txt  blah.8.txt
blah.13.txt  blah.29.txt  blah.44.txt  blah.5.txt   blah.75.txt  blah.90.txt
blah.14.txt  blah.2.txt   blah.45.txt  blah.60.txt  blah.76.txt  blah.91.txt
blah.15.txt  blah.30.txt  blah.46.txt  blah.61.txt  blah.77.txt  blah.92.txt
blah.16.txt  blah.31.txt  blah.47.txt  blah.62.txt  blah.78.txt  blah.93.txt
blah.17.txt  blah.32.txt  blah.48.txt  blah.63.txt  blah.79.txt  blah.94.txt
blah.18.txt  blah.33.txt  blah.49.txt  blah.64.txt  blah.7.txt   blah.95.txt
blah.19.txt  blah.34.txt  blah.4.txt   blah.65.txt  blah.80.txt  blah.96.txt
blah.1.txt   blah.35.txt  blah.50.txt  blah.66.txt  blah.81.txt  blah.97.txt
blah.20.txt  blah.36.txt  blah.51.txt  blah.67.txt  blah.82.txt  blah.98.txt
blah.21.txt  blah.37.txt  blah.52.txt  blah.68.txt  blah.83.txt  blah.99.txt
blah.22.txt  blah.38.txt  blah.53.txt  blah.69.txt  blah.84.txt  blah.9.txt
blah.23.txt  blah.39.txt  blah.54.txt  blah.6.txt   blah.85.txt
blah.24.txt  blah.3.txt   blah.55.txt  blah.70.txt  blah.86.txt
blah.25.txt  blah.40.txt  blah.56.txt  blah.71.txt  blah.87.txt

$ cat blah.67.txt 
rawr

$ echo "hooray" > original.txt

$ cat original.txt | tee blah.*.txt
hooray

$ cat blah.67.txt 
hooray
0
ответ дан 14 September 2012 в 04:30

Вы можете попробовать это, избегая циклов for и держа все в одной строке:

ls blah.* | xargs -n 1 cp original

Вы получаете cp: target blah.1.txt is not a directory в своей первоначальной попытке, потому что cp'ing для нескольких файлов предполагает перемещение все они в каталог, указанный в качестве последнего аргумента. Это просто неправильный синтаксис. Цитирую man cp:

SYNOPSIS
       cp [OPTION]... [-T] SOURCE DEST
       cp [OPTION]... SOURCE... DIRECTORY
       cp [OPTION]... -t DIRECTORY SOURCE...

DESCRIPTION
       Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

Одно только использование cp не поможет вам. См. Также этот вопрос .

0
ответ дан 14 September 2012 в 04:30

Используйте bash for (при условии, что вы используете bash):

for file in blah.*.txt; do
    cp original.txt "$file"
done
0
ответ дан 14 September 2012 в 04:30

Сделайте это:

for i in `ls *.txt`; do cat original > $i; done

где оригинал - текстовый файл. cat просто сбрасывает содержимое, а > передает содержимое в новый файл, представленный как $i (расширенный из списка, возвращаемого командой ls *.txt)

Обратите внимание, что эти файлы будут полностью перезаписаны так что вы можете сначала сохранить их в другом каталоге. Это будет сделано для всего с расширением .txt (включая исходный файл, если это расширение .txt), так что вы можете захотеть переименовать вещи или использовать лучшее соглашение (например, blah * вместо * .txt)

0
ответ дан 14 September 2012 в 04:30

Вот еще одна опция, использующая find:

find ./ -name 'blah.*.txt' -exec cp original.txt {} \;

. Вы просите find запустить в текущем каталоге и найти файлы, имя которых соответствует шаблону (в кавычках, чтобы избежать расширения оболочки). он и пусть find выполняет расширение шаблона), и для каждого найденного файла выполните команду между -exec и \;. В этой команде {} заменяется именем найденного файла.

Посмотрите на этот ответ для получения большой информации об эффективном использовании find:

Как я могу использовать команду find более эффективно?

0
ответ дан 14 September 2012 в 04:30

Другие вопросы по тегам:

Похожие вопросы: