сценарий оболочки для перемещения выбранных файлов из одного каталога в другой

gitсам по себе не предоставляет информацию о владельце и привилегиях, кроме информации об исполняемых битах. Решение для вас — использовать данные etckeeper. Глядя в документацию, мы видим:

Большинство VCS, включая git, mercurial и bazaar, имеют только ограниченное отслеживание метаданных файла, имея возможность отслеживать исполняемый бит, но не другие разрешения или информацию о владельце. (darcs даже не отслеживает исполняемые биты.) Таким образом, метаданные файлов хранятся отдельно. Помимо прочего, etckeeper init устанавливает хук перед фиксацией, который сохраняет метаданные о владельцах файлов и разрешениях в файле /etc/.etckeeper. Эти метаданные хранятся в системе управления версиями вместе со всем остальным и могут быть применены, если репозиторий нужно будет вернуть обратно.

Таким образом, права собственности на ваши каталоги хранятся в /etc/.etckeeper, который также контролируется git. ;)

  • etckeeper commitдолжен решить вашу проблему.

В зависимости от вашего масштаба я бы подумал о более сложных и полезных инструментах управления конфигурацией, таких как Salt, Ansible, Puppet, Chef и так далее.

1
29.12.2016, 08:17
5 ответов

Я закончил с приведенным ниже кодом, который был опубликован вчера, пожалуйста, посмотрите o / p ниже: поделитесь своей ошибкой

[root@rhel1 New_folder]# ll
total 12
-rw-r--r--. 1 root root   0 Dec  7 23:34 1
-rw-r--r--. 1 root root   0 Dec  7 23:34 3
-rw-r--r--. 1 root root   0 Dec 30 16:34 new folder1
-rw-r--r--. 1 root root   0 Dec 30 16:34 new folder2
-rw-r--r--. 1 root root   0 Dec 30 16:34 new folder3
-rw-r--r--. 1 root root  11 Dec  8 01:13 req_files.txt
-rwxr-xr-x. 1 root root 231 Dec  8 01:22 tesh.sh
-rw-r--r--. 1 root root 135 Dec  8 01:21 test1.sh
[root@rhel1 New_folder]# cat req_files.txt
New folder
[root@rhel1 New_folder]# vi req_files.txt
[root@rhel1 New_folder]# sh -x tesh.sh
++ echo -en '\n\b'
+ IFS='                                                                                                                                                                '
+ prev_dir=/cygdrive/c/Users/abhisek.samanta/Desktop/New_folder
+ new_dir=/cygdrive/c/Users/abhisek.samanta/Desktop/New
+ cd /cygdrive/c/Users/abhisek.samanta/Desktop/New_folder
++ cat req_files.txt
+ for i in '`cat req_files.txt`'
+ mv '/cygdrive/c/Users/abhisek.samanta/Desktop/New_folder/new folder1' /cygdrive/c/Users/abhisek.samanta/Desktop/New/
+ for i in '`cat req_files.txt`'
+ mv '/cygdrive/c/Users/abhisek.samanta/Desktop/New_folder/new folder2' /cygdrive/c/Users/abhisek.samanta/Desktop/New/
+ for i in '`cat req_files.txt`'
+ mv '/cygdrive/c/Users/abhisek.samanta/Desktop/New_folder/new folder3' /cygdrive/c/Users/abhisek.samanta/Desktop/New/
+ IFS=
[root@rhel1 New_folder]# ll
total 12
-rw-r--r--. 1 root root   0 Dec  7 23:34 1
-rw-r--r--. 1 root root   0 Dec  7 23:34 3
-rw-r--r--. 1 root root  36 Dec 30 16:34 req_files.txt
-rwxr-xr-x. 1 root root 231 Dec  8 01:22 tesh.sh
-rw-r--r--. 1 root root 135 Dec  8 01:21 test1.sh
[root@rhel1 New_folder]# ll ../New/
total 0
-rw-r--r--. 1 root root 0 Dec  7 23:34 2
-rw-r--r--. 1 root root 0 Dec  7 23:34 4
-rw-r--r--. 1 root root 0 Dec  7 23:34 5
-rw-r--r--. 1 root root 0 Dec  8 00:56 New folder
-rw-r--r--. 1 root root 0 Dec 30 16:34 new folder1
-rw-r--r--. 1 root root 0 Dec 30 16:34 new folder2
-rw-r--r--. 1 root root 0 Dec 30 16:34 new folder3
[root@rhel1 New_folder]#
0
28.01.2020, 01:05

Спасибо всем за то, что нашли драгоценное время для решения моей проблемы. Я хотел бы рассказать, как я это решил:

prev_dir=/cygdrive/c/Users/abhisek.samanta/Desktop/Table_scripts
new_dir=/cygdrive/c/Users/abhisek.samanta/Desktop/New
cd $prev_dir
for i in `cat req_files.txt`
do
   sed -i 's/\r$//' $i 
   echo $i
   cd $prev_dir
   mv $i $new_dir
done

Тот же старый короткий код работал без особых настроек. Спасибо всем за искреннее сотрудничество. :)

0
28.01.2020, 01:05

Прежде всего, чтобы удалить \ r из имени файла, вы можете попробовать:

FILENAME=$(echo $FILENAME|tr -d '\r')
  • -d удалить символы

И я предлагаю использовать этот способ в итерации:

while read filename ; do
    filename=$(echo $filename |tr -d '\r')
    mv $prev_dir/$filename $new_dir
done < $prev_dir/req_files.txt
1
28.01.2020, 01:05

Используйте IFS, который определяет разделитель полей.

SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
prev_dir=/cygdrive/c/Users/abhisek.samanta/Desktop/New_folder
new_dir=/cygdrive/c/Users/abhisek.samanta/Desktop/New
cd $prev_dir
for i in `cat req_files.txt`
do
   mv $prev_dir/$i $new_dir/
done
IFS=$SAVEIFS
-1
28.01.2020, 01:05

Я знаю, что это пара дней назад, но я не уверен, что циклы оболочки необходимы, так как команда sed может прочитать весь файл самостоятельно, прежде чем использовать что-то вроде xargs для объединения всех файлов в одна команда mv:

prev_dir=/cygdrive/c/Users/abhisek.samanta/Desktop/Table_scripts
new_dir=/cygdrive/c/Users/abhisek.samanta/Desktop/New

cd ${prev_dir}
sed 's/\r$//' filelist | xargs mv -t $new

Здесь, используя указанные каталоги, и найденная вами команда sed работает, тогда, поскольку все передается по конвейеру в xargs , она добавит каждую строку из канал на команду mv , которая может принимать несколько файлов и затем перемещать их все в каталог, указанный с помощью флага -t

$ > cat movefile.sh 
new="$(pwd)/dir1/"
sed 's/\r$//' filelist | xargs mv -t $new
$ > cat -v filelist 
file1^M
file2^M
file3^M

$ > touch file{1,2,3}
$ > ls -l
total 16
drwxr-xr-x 2 grownups users 4096 Jan  1 22:29 dir1
-rw-r--r-- 1 grownups users    0 Jan  1 22:30 file1
-rw-r--r-- 1 grownups users    0 Jan  1 22:30 file2
-rw-r--r-- 1 grownups users    0 Jan  1 22:30 file3
-rw-r--r-- 1 grownups users   22 Jan  1 22:26 filelist
-rwxr--r-- 1 grownups users   61 Jan  1 22:29 movefile.sh
$ > ls dir1/
$ > ./movefile.sh 
$ > ls -l dir1/
total 0
-rw-r--r-- 1 grownups users 0 Jan  1 22:30 file1
-rw-r--r-- 1 grownups users 0 Jan  1 22:30 file2
-rw-r--r-- 1 grownups users 0 Jan  1 22:30 file3
$ > 
0
28.01.2020, 01:05

Теги

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