简体   繁体   中英

Running Command Recursively in all Subdirectories

I have a folder which contains a depth of up to 3 layers of subdirectories, with images in the deepest subdirectory (for most images, this is just one level). I want to rename these images to include the name of the directory they are in as a prefix. For this, I need to be able to run a single command for each subdirectory in this tree of subdirectories. This is my attempt:

DIRS=/home/arjung2/data_256_nodir/a/*

for dir in $DIRS
do
    for f in $dir
    do
        echo "$dir" 
        echo "$f"
        echo "$dir_$f"
        mv "$f" "$dir_$f"
    done
done

However, the first three echo s prints out the same thing for each 1-level deep subdirectory (not all up to 3-level deep subdirectories as I desire), and gives me an error. An example output is the following:

/home/arjung2/data_256_nodir/a/airfield
/home/arjung2/data_256_nodir/a/airfield
/home/arjung2/data_256_nodir/a/airfield
mv: cannot move ‘/home/arjung2/data_256_nodir/a/airfield’ to a subdirectory of itself, ‘/home/arjung2/data_256_nodir/a/airfield/airfield’ 

Any ideas what I'm doing wrong? Any help will be much appreciated, thanks!!

Say dir has the value /home/arjung2/data_256_nodir/a/airfield . In this case, the statement

for f in $dir

expands to

for f in /home/arjung2/data_256_nodir/a/airfield

which means that the inner loop will be executed exactly once, f taking the name /home/arjung2/data_256_nodir/a/airfield , which is the same as dir .

It would make more sense to iterate over the files within the directory:

for f in $dir/*

Assuming all images can be identified with 'find' (eg, by suffix), consider the following bash script:

#! /bin/bash

find . -type f -name '*.jpeg' -print0 | while read -d '' file ; do
    d=${file%/*};
    d1=${d##*/};
    new_file="$d/${d1}_${file##*/}"
    echo "Move: $file -> $new_file"
    mv "$file" "$new_file"
done

It will move a/b/c.jpeg to a/b/b_c.jpeg, for every folder/file. Adjust (or remove) the -name as needed.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM