sort find results


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers sort find results
# 1  
Old 02-17-2012
sort find results

Hi,

I have a problem with a shell script.
The script should find all .cpp and .h files and list them.

With:
Code:
 
for file in `find $src -name '*.h' -o -name '*.cpp'

it gives out this:
Code:
 
H:\FileList\A\E\F\G\newCppFile.cpp
H:\FileList\header01.h
H:\FileList\B\nextCppFile.cpp

but i want that it sorts like this:
Code:
 
H:\FileList\header01.h
H:\FileList\A\E\F\G\newCppFile.cpp
H:\FileList\B\nextCppFile.cpp


How is this possible?

---------- Post updated at 07:43 AM ---------- Previous update was at 04:43 AM ----------

Has nobody an idea?

Last edited by shellBeginner75; 02-17-2012 at 08:36 AM..
# 2  
Old 02-17-2012
Quote:
for file in `find $src -name '*.h' -o -name '*.cpp'
First let's avoid using "for" for open-ended lists.
There is no easy way with unix "sort" to cause the "h" of "header01" to appear before the "A" or the "B". Now if you had called it "01header.h" that would be a better design but I recognise that this is an include file and that the name is important!


Code:
# This is not the solution but does avoid the "for" problem.
find $src -name '*.h' -o -name '*.cpp' | sort
while read filename
do
           # Whatever you need to do
done

You can get the "header01.h" at the top of the list with "sort -r" but the subdirectories would be reversed.

Last edited by methyl; 02-17-2012 at 08:58 AM..
# 3  
Old 02-17-2012
I suppose we could use two "find" commands.
The exact syntax would depend on what Operating System and Shell you have.
This use of subshell ( ) is for "ksh".

Code:
(
find $src -name '*.h' -print | sort
find $src -name -name '*.cpp' -print | sort
) | while read filename
do
        # Whatever you need to do
done


Last edited by methyl; 02-17-2012 at 09:05 AM.. Reason: sort the .h in case more than one
# 4  
Old 02-17-2012
Hi.

You could use a non-standard collating sequence with a non-standard utility:
Code:
#!/usr/bin/env bash

# @(#) s1	Demonstrate msort custom collating sequence.
# http://billposer.org/Software/msort.html

# Utility functions: print-as-echo, print-line-with-visual-space, debug.
# export PATH="/usr/local/bin:/usr/bin:/bin"
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }
edges() { local _f _n _l;: ${1?"edges: need file"}; _f=$1;_l=$(wc -l $_f);
  head -${_n:=3} $_f ; pe "--- ( $_l: lines total )" ; tail -$_n $_f ; }
db() { ( printf " db, ";for _i;do printf "%s" "$_i";done;printf "\n" ) >&2 ; }
db() { : ; }
C=$HOME/bin/context && [ -f $C ] && $C msort

FILE=${1-data1}

pl " Input data file $FILE:"
cat $FILE

pl " Results, default collating sequence:"
msort -l -q -w $FILE

pl " Results, custom collating sequence:"
msort -l -q -w -s collating-sequence.txt $FILE

pl " Custom: collating-sequence.txt:"
cat collating-sequence.txt

exit 0

producing:
Code:
% ./s1

Environment: LC_ALL = C, LANG = C
(Versions displayed with local utility "version")
OS, ker|rel, machine: Linux, 2.6.26-2-amd64, x86_64
Distribution        : Debian GNU/Linux 5.0.8 (lenny) 
bash GNU bash 3.2.39
msort 8.44

-----
 Input data file data1:
H:\FileList\A\E\F\G\newCppFile.cpp
H:\FileList\header01.h
H:\FileList\B\nextCppFile.cpp

-----
 Results, default collating sequence:
H:\FileList\A\E\F\G\newCppFile.cpp
H:\FileList\B\nextCppFile.cpp
H:\FileList\header01.h

-----
 Results, custom collating sequence:
H:\FileList\header01.h
H:\FileList\A\E\F\G\newCppFile.cpp
H:\FileList\B\nextCppFile.cpp

-----
 Custom: collating-sequence.txt:
a
b
c
d
e
f
g
h
A
B

The msort utility was in the Debian repository. See the web page noted in the script for a PDF of documentation and other details ... cheers, drl

Quote:
"Non-standard" extant tools often: are general, have the
simplest, most appropriate interface, and are convenient
alternatives in the context of equally useful, but
"non-standard", nonce (one-off) awk, perl, ruby scripts.
The knowledge that such tools exist can be of advantage for
solving future similar, but specifically different problems.
( edit 1: minor typo )

Last edited by drl; 02-17-2012 at 05:42 PM..
# 5  
Old 02-17-2012
Personally if we are going to use a unix directory structure as a database I would take a few minutes to consider the design of the directory stucture and taking into account the normal ASCII collating sequence.
 
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Strange results from 'strings | sort'

Using the 'strings' command and piping the result to 'sort' is producing strange results. I get block of lines that begin with asterisks, then a block that begins with some text, then more lines that begin with asterisks. The actual content is correct - lines beginning with asterisks is the... (5 Replies)
Discussion started by: edstevens
5 Replies

2. UNIX for Beginners Questions & Answers

Inconsistent results using sort function

Could you please advise on the following: I have two space-delimited files with 9 and 10 columns, respectively, with exactly the same values in column 1. However, the order of column 1 differs between the two files, so I want to sort both files by column 1, so that I can align them and... (6 Replies)
Discussion started by: aberg
6 Replies

3. UNIX for Beginners Questions & Answers

Strange sort -r results

Hi Folks - I have this file that looks like this: outbox/logs/Client_1042.log outbox/logs/Client_941.log outbox/logs/Client_942.log outbox/logs/Client_943.log outbox/logs/Client_944.log And this is my code: #!/bin/bash _OUTBOX_BIN="outbox/logs/" _NAME="Client" _TEMP="temp.txt"... (9 Replies)
Discussion started by: SIMMS7400
9 Replies

4. UNIX for Beginners Questions & Answers

Weird 'find' results

Hello and thanks in advance for any help anyone can offer me I'm trying to learn the find command and thought I was understanding it... Apparently I was wrong. I was doing compound searches and I started getting weird results with the -size test. I was trying to do a search on a 1G file owned by... (14 Replies)
Discussion started by: bodisha
14 Replies

5. UNIX for Dummies Questions & Answers

How to do ls -l on results of grep and find?

Hi, Am running the command below to search for files that contains a certain string. grep -il "shutdown" `find . -type f -mtime -1 -print` | grep "^./scripts/active" How do I get it to do a ls -l on the list of files? I tried doing ls -l `grep -il "shutdown" `find . -type f -mtime -1... (5 Replies)
Discussion started by: newbie_01
5 Replies

6. UNIX for Dummies Questions & Answers

LINUX SORT command chops results

I am trying to sort a file . The file looks like this: DDFF 2 /ztpfrepos/pgr/load DDFQ 2 /ztpfrepos/pgr/load DDFX 2 /ztpfrepos/pgr/load DDUA 2 /ztpfrepos/pgr/load My command: sort -k1 /home/c153507/Bin/OPL1.txt -o /home/c153507/Bin/OPL1.txt The results are OK except for one line where... (4 Replies)
Discussion started by: Yahalom
4 Replies

7. Shell Programming and Scripting

Help with sort folder results

Here is the code, but the list is not sorted properly (alphabetically)? <?php function folderlist(){ $startdir = './'; $ignoredDirectory = '.'; $ignoredDirectory = '..'; if (is_dir($startdir)){ if ($dh = opendir($startdir)){ while (($folder = readdir($dh)) !== false){ if... (0 Replies)
Discussion started by: mrlayance
0 Replies

8. Shell Programming and Scripting

HELP: I need to sort a text file in an uncommon manner, can't get desired results

Hi All I have a flat text file. Each line in it contains a "/full path/filename". The last three columns are predictable, but directory depth of each line varies. I want to sort on the last three columns, starting from the last, 2nd last and 3rd last. In that order. The last three columns... (6 Replies)
Discussion started by: JakeKatz
6 Replies

9. UNIX for Dummies Questions & Answers

How to sort find results

Hi-- Ok. I have now found that: find -x -ls will do what I need as far as finding all files on a particular volume. Now I need to sort the results by the file's modification date/time. Is there a way to do that? Also, I notice that for many files, whereas the man for find says ls is... (8 Replies)
Discussion started by: groundlevel
8 Replies

10. UNIX for Dummies Questions & Answers

find results

Hi, how can I get only useful results from find / -size 10000000 without the "Permissions denied" files ? tks C (5 Replies)
Discussion started by: Carmen123
5 Replies
Login or Register to Ask a Question