Sponsored Content
Top Forums Shell Programming and Scripting Moving files to their respective subdirectories Post 302407219 by durden_tyler on Wednesday 24th of March 2010 09:31:07 PM
Old 03-24-2010
Quote:
Originally Posted by avatar_007
...could you please explain your code a little bit. its doing the right thing but i am kind of confused...
Well, it would've been much easier for me if you had asked *specific questions* about the code. It's very difficult for me to gauge your level of understanding of different concepts like -
(a) the options passed to the perl interpreter, e.g. "l", "n", "e"
(b) the chomp operator of Perl
(c) the concept of hashes in Perl, and in general
(d) level of understanding of regular expressions
(e) BEGIN and END blocks in a Perl one-liner
(f) the "uc" function of Perl

So, I will try to explain my code at a very high level. If you want to delve into specifics, you may want to look up all the concepts (a) through (f) in a good book on Perl, or at the perl.org website, or by talking to your local Perl guru.

In one sentence - I built a hash that had filenames from "img.txt" as the keys and their destination directories from "petdir.txt" as their corresponding values.

Here's the code spread out and documented -

Code:
     1  ##
     2  perl -lne 'chomp;                               # remove the newline at the end of the current line being processed
     3             if ($ARGV eq "img.txt") {            # if the current line is of file "img.txt" then
     4               if (/.*(\d{3}[_-]\d\d[ab]).*/i) {  # extract the "NNN[_-]NN[ab]" pattern and store it in $1
     5                 $y=uc($1);                       # change the case of $1 to upper-case and assign it to $y
     6                 $y=~s/-/_/;                      # replace the hyphen "-" by underscore "_" in $y
     7                 $x{$_}=$y                        # add (key,value) = (current_line, $y) in the hash %x
     8               }                                  # end of pattern match
     9             }                                    # end of processing "img.txt"
    10             elsif (/.*zoca_(.{7}).*/i) {         # at this point, we are *ALWAYS* processing "petdir.txt"; 
    11                                                  # so extract 7 characters after "zoca_" and store it in $1
    12               $y=uc($1);                         # change the case of $1 to upper-case and assign it to $y
    13               $y=~s/-/_/;                        # replace the hyphen "-" by underscore "_" in $y
    14               foreach $k (keys %x) {             # now we have to check if the current value of $y exists as a *key value*
    15                                                  # for any key in the hash %x; if it does, then set the *key value* to
    16                                                  # current line
    17                 if ($x{$k} eq $y) {              # if $y is the same as a *key value* for any key in %x, then
    18                   $x{$k} = $_                    # set that *key value* to current line (of "petdir.txt", that is)
    19                 }                                # done comparing *key value* to $y
    20               }                                  # done looping through the hash %x
    21             }                                    # done processing "petdir.txt"
    22             END {                                # we have the complete hash now. each key is a filename from "img.txt"
    23                                                  # and its corresponding value is the destination from "petdir.txt"
    24                                                  # and this correspondence was set due to the matching regexes
    25               foreach $k (keys %x) {             # now just loop through the hash and display "mv <key> <value>"
    26                 printf("mv %s %s\n",$k,$x{$k})
    27               }
    28             }' img.txt petdir.txt

Hope that clears up any questions that you might have.

tyler_durden
 

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

copy certain files from subdirectories

Hi all, I'd very grateful for some help with the following. I have a variable number of subdirectories each of which contain a uniquely names results file of the form Results*.dat. I would like to search through all subdirectories and copy out these results file to another directory so that... (3 Replies)
Discussion started by: iomaire
3 Replies

2. UNIX for Dummies Questions & Answers

list the files but exclude the files in subdirectories

If I execute the command "ls -l /export/home/abcde/dev/proj/code/* | awk -F' ' '{print $9}' | cut -d'/' -f6-8" it will list all the files in /export/home/abcde/dev/proj/code/ directory as well as the files in subdirectories also proj/code/test.sh proj/code/test1.c proj/code/unix... (8 Replies)
Discussion started by: shyjuezy
8 Replies

3. Shell Programming and Scripting

Help with moving files with same names from subdirectories?

I was wondering if someone could help me with this: I have multiple directories and subdirectories with files in them. I need to move all files from all directories and subdirectories into one root directory. However, when i do find /home/user -mindepth 1 -iname "*" -type f -exec mv {} . \; ... (3 Replies)
Discussion started by: r4v3n
3 Replies

4. Shell Programming and Scripting

Find all .htaccess files and make a backup copy in respective directories

Hey guys, I need to know how to locate all .htaccess files on the server and make a backup of them in the folder they reside before I run a script to modify all of them. So basically taking dir1/.htaccess and copying it as dir1/.htaccess_bk dir2/.htaccess copying as dir2/.htaccess_bk... (5 Replies)
Discussion started by: boxx
5 Replies

5. Shell Programming and Scripting

Script to extract all deb files in a fldr to respective folderstructures

Hi, since half an hour I currently try to write a script that will: 1) Extract every debian file in a directory 2) Extracts it to a folder that matches the debians filename 3) Extracts it so the structure looks like that: DEBIANFILENAME | -------------- DEBIAN ... (9 Replies)
Discussion started by: pasc
9 Replies

6. UNIX for Dummies Questions & Answers

rename files based on their respective directory name

I have a number of files in directories labeled like this: /Data/tr_gray/tr_DTI/dti_FA.nii.gz (the brackets here represent a range of number that the files are labeled with) I need to rename each dti_FA.nii.gz file according to the name of the folder it resides in. For example, the file ... (3 Replies)
Discussion started by: tk0034
3 Replies

7. Shell Programming and Scripting

Bash script deleting my files, and editing files in subdirectories question

#!/bin/bash # name=$1 type=$2 number=1 for file in ./** do if then filenumber=00$number elif then filenumber=0$number fi tempname="$name""$filenumber"."$type" if (4 Replies)
Discussion started by: TheGreatGizmo
4 Replies

8. Shell Programming and Scripting

Unzip all the files with subdirectories present and append a part of string from the main .zip files

Hi frnds, My requirement is I have a zip file with name say eg: test_ABC_UH_ccde2a_awdeaea_20150422.zip within that there are subdirectories on each directory we again have .zip files and in that we have files like mama20150422.gz and so on. Iam in need of a bash script so that it unzips... (0 Replies)
Discussion started by: Ravi Kishore
0 Replies

9. Shell Programming and Scripting

Append string to all the files inside a directory excluding subdirectories and .zip files

Hii, Could someone help me to append string to the starting of all the filenames inside a directory but it should exclude .zip files and subdirectories. Eg. file1: test1.log file2: test2.log file3 test.zip After running the script file1: string_test1.log file2: string_test2.log file3:... (4 Replies)
Discussion started by: Ravi Kishore
4 Replies

10. Shell Programming and Scripting

Copy files in respective directories

Hi Guys, I need to copy the files to respective directories based on name of the file. My script is something like below con=$1 for file in `cat $con` do file_tmp=$(ls -t1 $path| grep -i $file | head -n 1) echo $file_tmp if then cp $path$file_tmp $DIR/ap if then... (16 Replies)
Discussion started by: Master_Mind
16 Replies
All times are GMT -4. The time now is 11:26 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy