2017-02-07 15 views
1

私はかなりスクリプトに慣れていますので、簡単にしてください。私はこれに関連しているが、私の問題を正確にカバーしていない別のフォーラムがあることを認識しています。ディレクトリ名へのファイル名の一致に基づいてディレクトリへのファイルのマージ

私はファイルを含むディレクトリと、各ファイルを移動するのに必要な対応するフォルダを含む別のディレクトリを持っています。

DS-123.txt /DS-123_alotofstuffhere/

私は最初に、ファイル名の最初の6つの文字の一致に基づいて移動を自動化したいと思います:各ファイルには次のように先のディレクトリに対応しますディレクトリの6。

私はこれがあります。

filesdir=$(ls ~/myfilesarehere/) 
dir=$(ls ~/thedirectoriesareinthisfolder/) 
for i in $filesdir; do 
    for j in $dir; do 
     if [[${i:6} == ${j:6}]]; then 
       cp $i $j 
     fi 
    done 
done 

をしかし、私は、スクリプトを実行したときに、私は次のエラーを取得する:

es: line 6: [[_DS-123_morefilenametext.fasta: command not found 

私は、Linux(スーパーコンピュータ上のどのバージョンがわからない、申し訳ありません)を使用しています。

+0

"私はこれを持っている":ここでは


は@tripleeにより示唆されるように、配列を使用しないソリューションです。あなたのコードにどのような問題があるのか​​を記述し、それに関連する*具体的な質問をしてください。 – kaylum

+0

'[['と ']]のあとにスペースが必要です。 'if [[$ {i:6} == $ {j:6}]];その後 ' – codeforester

+0

私の答えは下記をご覧ください。私はそれを試して、それは動作します。 – codeforester

答えて

1

lsではなく、ファイルとディレクトリのリストを保持するために配列とグロビングを使用する方がよいでしょう。 [[ ... ]]部分にその変更及び修正で、あなたは私たちに、このコード:あなたのdirs配列があまりにもいくつかのファイルが含まれている可能性があるため

files=(~/myfilesarehere/*) 
dirs=(~/thedirectoriesareinthisfolder/*) 
for i in "${files[@]}"; do 
    [[ -f "$i" ]] || continue   # skip if not a regular file 
    for j in "${dirs[@]}"; do 
    [[ -d "$j" ]] || continue  # skip if not a directory 
    ii="${i##*/}" # get the basename of file 
    jj="${j##*/}" # get the basename of dir 
    if [[ ${ii:0:6} == ${jj:0:6} ]]; then 
     cp "$i" "$j" 
     # need to break unless a file has more than one destination directory 
    fi 
    done 
done 

[[ -d "$j" ]]をチェックが必要です。より安全になるように、私は$iのファイルもチェックするようにしました。

for i in ~/myfilesarehere/*; do 
    [[ -f "$i" ]] || continue   # skip if not a regular file 
    for j in ~/thedirectoriesareinthisfolder/*; do 
    [[ -d "$j" ]] || continue  # skip if not a directory 
    ii="${i##*/}" # get the basename of file 
    jj="${j##*/}" # get the basename of dir 
    if [[ ${ii:0:6} == ${jj:0:6} ]]; then 
     cp "$i" "$j" 
     # need to break unless a file has more than one destination directory 
    fi 
    done 
done 
+1

ありがとう!これはうまくいった! (ファイルのベース名を取得するための完璧な追加) – imginger

+0

あなたが解決策に満足すれば、その答えを受け入れることができます。 [誰かが私の質問に答えるときに何をするか] – codeforester

+1

最初の配列は有用な目的を果たしていないようです。単に〜for myfilesarehere/*を代わりに使うことができます。 – tripleee

関連する問題