2014-09-29 4 views
1

Я хочу переместить файл в папку на основе расширения своего файла. пример: если файл является .csv, он должен перейти в папку COMPLETED, если файл имеет любое расширение, отличное от любого .csv, тогда он должен перейти в папку REGULAR.unix shell scripting-using mv command in if condition

Ниже приведен сценарий моей оболочки и не работает. Не могли бы вы сообщить мне, в чем проблема?

#!/bin/bash 
cd /apps/int/apd/$1/work 

if ls /apps/int/apd/$1/work/*.csv &> /dev/null; then 
    mv *.csv /apps/int/apd/$1/COMPLETED 
else 
    /apps/int/apd/$1/Regular 
fi 

ответ

5

Почему вы должны проверить наличие файлов *.csv?

#!/bin/bash 
cd /apps/int/apd/$1/work 

mv *.csv /apps/int/apd/$1/COMPLETED 2>/dev/null 
mv * /apps/int/apd/$1/Regular 

Здесь первый .csv файлы перемещаются в папку COMPLETED. Затем остальные файлы перемещаются в папку Regular.

Предполагается, что вы создали COMPLETED и Regular папки.

+0

Проверка на наличие файлов csv перед вызовом 'mv' позволяет разделить два возможных пути: mv' может не работать: невозможно переместить файл с буквами« * .csv »и не иметь возможности переместить фактический csv-файлы. – chepner

+0

Но из требования, что я вижу, должен быть перемещен любой файл с расширением '.csv'. Таким образом, даже если имя файла буквально «* .csv», я думаю, что его также следует перенести. – Fazlin

+0

Скорее всего, однако, что нет файла с именем '* .csv', но это имя передается' mv' оболочкой, что приведет к сбою 'mv'. Поскольку вы отключите сообщение об ошибке, чтобы избежать этого, вы не будете знать, была ли какая-то другая проблема с 'mv', например, каталог' COMPLETED' не существует. Лучше проверить условия ошибки, которые вы * можете * предвидеть и показывать сообщения об ошибках, которые вы не можете. Одним из возможных последствиях является то, что первый «mv» терпит неудачу, затем * все * файлы перемещаются в 'Regular'. – chepner

0

Измените YOUR_PATH на ваш конкретный путь и ваш путь для/ЗАВЕРШЕНО/и/REGULAR /.

Если бы я получил то, что хотел объяснить я думаю, что ваши переменные выглядеть theese:

/YOUR_PATH/ = /apps/int/apd/$1/work 
/COMPLETED/ = /apps/int/apd/$1/COMPLETED 
/REGULAR/ = /apps/int/apd/$1/Regular  

Вы можете попробовать это. :)

#!/bin/bash 

for filename in /YOUR_PATH/*; 
do 
    Path="$filename" 
    extension="${filename##*.}" 
    if [ "${extension}" = 'csv' ]; then 
      mv $Path /COMPLETED/ 
    else 
      mv $Path /REGULAR/ 
    fi 
done 

Если вам что-то требуется, оставьте комментарий. :)