2016-10-04 12 views
0

新品の.shに新しくなりました。古いアイフォンから画像をバックアップしていました。私はそれぞれから写真を撮り、すべてを1つのディレクトリにダンプする必要がある何百ものディレクトリがあります。現在のディレクトリ内の複数のディレクトリの内容を新しいディレクトリにコピーします。

私の最高の試み:受け取っ

​​

エラー:

massmove.sh: line 1: $'\r': command not found 
massmove.sh: line 2: $'\r': command not found 
massmove.sh: line 3: $'\r': command not found 
massmove.sh: line 4: syntax error near unexpected token `$'{\r'' 
'assmove.sh: line 4: `function process() { 

更新:deefffの答えを経て改良:

function process() { 

for i in */*.* 
do 
    cp -r $i ${dir} 

done 

} 

echo "This script will take the contents of each directory in the current directory and mv it's contents into a new directory that you will specify" 
echo "Name your new directory" 
read dir 
mkdir ${dir} 

echo process 

はまだこれらのエラーを投げている:

massmove.sh: line 2: syntax error near unexpected token `$'{\r'' 
'assmove.sh: line 2: `function process() { 

が、これはWSLのバグだろうか?

私は

cp */*.* ${dir} 

が私のタスクを達成するために迅速かつ強力な方法ですが、私はまた、エラーを引き起こしているものに非常に興味があることを理解しています。

+0

あなたのスクリプトファイルにWindowsスタイルの行末を持っていることを示しています。 – Joe

答えて

1

*は、ディレクトリを含むすべてのエントリと一致するので、現在のフォームでは、ディレクトリ構造全体がコピーされることになります。また、cpコマンドで変数i$iとする必要があります。また、変数aは無意味に見えます。このようにそれを試してみてください。実際には

function process() { 

for i in */*.* 
do 
    cp $i ${dir} 
done 

} 

、私はちょうどこれが同様にトリックを行う必要があることを実現:、また

function process() { 
    for file in *; do 
     if [[ ${file} != ${dir} ]]; then 
      cp -r ${file} ${dir} 
     fi 
    done 
} 

cp */*.* ${dir}

0

はこのような何かを試してみてください「プロセス」関数を呼び出す前にディレクトリを作成することを忘れないでください。

echo "Name your new directory: " 
read dir 
mkdir ${dir} 
1

以下のスクリプトをご覧ください。

基本的に3つの機能があります:メニュー、prnt(日付付きの行を印刷する)、およびプロセス(ファイルを処理する)です。それはオプションで動作するメニューを持っています。あなたがそれを好きだと思います。

乾杯!エラーメッセージの\ Rを有する

のGaurav

#!/bin/bash 


curdir=`pwd`   # Take the current directory 


# To print out logs on the screen, with date and time !!! 
prnt() 
{ 
     d=`date +"%d-%m-%y "%T`  # Take the date string using bash date function. 
     echo "$d|$1"  # Whenever prnt is called, it will echo back, date plus the line passed to it, in nice date|line format. 
} 

# Menu for the whole operation. This is just the definition. Its being called from the bottom of the script. 
menu() 
{ 

     # Specially made for you my friend !! 

     echo ; echo ; prnt " <<!!*** .. params_noob's file copier .. ***!!>>" ; echo ; echo 
     echo ; prnt "Currently we are in $curdir" ; echo 
     prnt "Enter the directory, where you would like to move files (Please enter full path and system will create it): " ; echo 

     read dir ; mkdir $dir 2>/dev/null # Read directory and make it. I am putting all errors to /dev/null. If directory is there, its there, don't want blabber. If not, then create it. 

     echo ;prnt "Entered directory is \"$dir\"" ; echo 
     prnt "Type y to go ahead OR n to start over again.." ; echo 

     read ans  # I have read the answer here 

     # A simple menu using case function of bash. 

     case $ans in 

     y) 
       echo ; prnt "You have entered yes, to move ahead" ; echo 
       prnt "processing files now...." 
       process $dir  # Here i am calling the process function. 
       ;; 
     n) 
       echo ; prnt "Starting over.. " ; echo 
       menu    # Here i am calling the menu itself, again. 
       ;; 
     0) 
       echo ; prnt "Exiting now.. " ; echo 
       exit    # Now exiting the script. 
       ;; 
     *) 
       # This one is just to let you know, if you enter anything else than y,n or 0. 
       echo ; prnt "Invalid input. Please enter y or n or 0 !!" ; echo 
       ;; 

     esac # Menu using case function ends with esac here. 

} 

# Function to process and move the files to the desired location. 
process() 
{ 
     # Took the argument passed to this function into variable "td" [target dirctory]. 

     td="$1" 

     # Using find command here to find all files. You an replace '-type f' with '-name "*.pic"' or '-name "*.jpg"' -- you get the picture - right? 

     find $curdir -type f | while read file # Feeding output of find to a while loop. 
     do 
       cp $file $td/ 
     done 

     a=`ls -lrt $td/* |wc -l`  # Now taking word count of all the files copied. 

     # Some more echo and priting.. just for aesthetics.. :) 

     echo ; echo ; prnt "  **** COPIED $a FILES from \[$curdir\] to \[$td\] ****" ; echo ; echo 

     echo ; echo ; ls -lrtha $td|head -10 ; echo ; echo 

     exit   # Script exits after processing the files. You can replace exit with menu, to go back to menu again. 

} 
# 
## 
### 
#### 
##### 
################################################################# 
     clear ; menu ### The main menu is being called from this line. I clear the screen first. Looks more professional :) 
################################################################# 

# FINISH # All done !! 
enter code here 

Here is the output in a picture format

関連する問題