Представьте, что мой каталог выглядел так:
./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
Еще один вариант с 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
Вы можете попробовать это, избегая циклов 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
не поможет вам. См. Также этот вопрос .
Используйте bash for
(при условии, что вы используете bash):
for file in blah.*.txt; do
cp original.txt "$file"
done
Сделайте это:
for i in `ls *.txt`; do cat original > $i; done
где оригинал - текстовый файл. cat
просто сбрасывает содержимое, а >
передает содержимое в новый файл, представленный как $i
(расширенный из списка, возвращаемого командой ls *.txt
)
Обратите внимание, что эти файлы будут полностью перезаписаны так что вы можете сначала сохранить их в другом каталоге. Это будет сделано для всего с расширением .txt (включая исходный файл, если это расширение .txt), так что вы можете захотеть переименовать вещи или использовать лучшее соглашение (например, blah * вместо * .txt)
Вот еще одна опция, использующая find
:
find ./ -name 'blah.*.txt' -exec cp original.txt {} \;
. Вы просите find
запустить в текущем каталоге и найти файлы, имя которых соответствует шаблону (в кавычках, чтобы избежать расширения оболочки). он и пусть find выполняет расширение шаблона), и для каждого найденного файла выполните команду между -exec
и \;
. В этой команде {}
заменяется именем найденного файла.
Посмотрите на этот ответ для получения большой информации об эффективном использовании find
: