shell script para mover arquivos selecionados de um diretório para outro

1

Eu tenho um requisito no qual tenho que mover arquivos específicos de um diretório para outro. Eu estou tendo a lista de arquivos desejados em um arquivo "req_files.txt"

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

Mas estou ficando abaixo do erro:

mv: cannot stat '/cygdrive/c/Users/abhisek.samanta/Desktop/New_folder/dbo.account_address_adt.Table\r': No such file or directory

Eu tentei o comando para remover o problema de quebra de linha, mas ainda não está funcionando:

sed -i 's/\r$//' test.sh
    
por Abhisek Samanta 29.12.2016 / 07:06

5 respostas

1

Primeiro, para remover \r do nome do arquivo, você pode tentar:

FILENAME=$(echo $FILENAME|tr -d '\r')
  • -d excluir caracteres

E eu sugiro usar desta forma na iteração:

while read filename ; do
    filename=$(echo $filename |tr -d '\r')
    mv $prev_dir/$filename $new_dir
done < $prev_dir/req_files.txt
    
por 29.12.2016 / 07:34
0

Estou ficando com o código abaixo compartilhado ontem, por favor, veja o / p abaixo: compartilhe seu erro

[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]#
    
por 30.12.2016 / 06:07
0

Obrigado a todos por aproveitarem seu tempo valioso para classificar meu problema. Gostaria de compartilhar o jeito que resolvi:

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

O mesmo código curto antigo foi executado sem muitos ajustes. Obrigado a todos pela vossa sincera cooperação. :)

    
por 30.12.2016 / 15:08
0

Eu sei que isso tem alguns dias, mas não tenho certeza se os loops do shell são necessários, pois o comando sed pode ler o arquivo inteiro por conta própria, antes de usar algo como xargs para combinar todos os arquivos um único comando 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

Aqui, usando os diretórios fornecidos, e o comando sed que você encontrou funciona, então, como tudo é canalizado para xargs , ele adicionará cada linha do pipe ao comando mv , que pode levar vários arquivos e, em seguida, mova todos eles para o diretório fornecido com o -t flag

$ > 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
$ > 
    
por 01.01.2017 / 23:46
-1

Por favor use o IFS que determina o separador de campos.

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
    
por 29.12.2016 / 14:08